Improved argument checking for sys_kcmp.  Derived from patch from
Christian Borntraeger.  Followup to r14451.  Pertains to #338106.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14473 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
index fd5bf0c..bcd00f1 100644
--- a/coregrind/m_syswrap/syswrap-linux.c
+++ b/coregrind/m_syswrap/syswrap-linux.c
@@ -10103,10 +10103,22 @@
 
 PRE(sys_kcmp)
 {
-   PRINT("kcmp ( %ld, %ld, %ld, %lu, %lu )", ARG1, ARG1, ARG3, ARG4, ARG5);
-   PRE_REG_READ5(long, "kcmp",
-                 vki_pid_t, pid1, vki_pid_t, pid2, int, type,
-                 unsigned long, idx1, unsigned long, idx2);
+   PRINT("kcmp ( %ld, %ld, %ld, %lu, %lu )", ARG1, ARG2, ARG3, ARG4, ARG5);
+   switch (ARG3) {
+      case VKI_KCMP_VM: case VKI_KCMP_FILES: case VKI_KCMP_FS:
+      case VKI_KCMP_SIGHAND: case VKI_KCMP_IO: case VKI_KCMP_SYSVSEM:
+         /* Most of the comparison types don't look at |idx1| or
+            |idx2|. */
+         PRE_REG_READ3(long, "kcmp",
+                       vki_pid_t, pid1, vki_pid_t, pid2, int, type);
+         break;
+      case VKI_KCMP_FILE:
+      default:
+         PRE_REG_READ5(long, "kcmp",
+                       vki_pid_t, pid1, vki_pid_t, pid2, int, type,
+                       unsigned long, idx1, unsigned long, idx2);
+         break;
+   }
 }
 
 #undef PRE
diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h
index 027ce7e..d719660 100644
--- a/include/vki/vki-linux.h
+++ b/include/vki/vki-linux.h
@@ -4502,6 +4502,19 @@
 #define VKI_MEDIA_IOC_ENUM_LINKS		_VKI_IOWR('|', 0x02, struct vki_media_links_enum)
 #define VKI_MEDIA_IOC_SETUP_LINK		_VKI_IOWR('|', 0x03, struct vki_media_link_desc)
 
+/* Comparison type */
+enum vki_kcmp_type {
+   VKI_KCMP_FILE,
+   VKI_KCMP_VM,
+   VKI_KCMP_FILES,
+   VKI_KCMP_FS,
+   VKI_KCMP_SIGHAND,
+   VKI_KCMP_IO,
+   VKI_KCMP_SYSVSEM,
+
+   VKI_KCMP_TYPES
+};
+
 #endif // __VKI_LINUX_H
 
 /*--------------------------------------------------------------------*/