]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Improved argument checking for sys_kcmp. Derived from patch from
authorJulian Seward <jseward@acm.org>
Fri, 5 Sep 2014 21:11:18 +0000 (21:11 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 5 Sep 2014 21:11:18 +0000 (21:11 +0000)
Christian Borntraeger.  Followup to r14451.  Pertains to #338106.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14473

coregrind/m_syswrap/syswrap-linux.c
include/vki/vki-linux.h

index fd5bf0c9acaf086f8fe9725470af83768e311a1e..bcd00f1cdf24272e6dfb4d7c2247f3902f18187e 100644 (file)
@@ -10103,10 +10103,22 @@ ML_(linux_POST_getregset) ( ThreadId tid, long arg3, long arg4 )
 
 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
index 027ce7e232a0012d35c6c2f84c63e15eaf7f05fd..d7196604dfc9a20a5c55e02006ee9a6a53290868 100644 (file)
@@ -4502,6 +4502,19 @@ struct vki_media_links_enum {
 #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
 
 /*--------------------------------------------------------------------*/