From: Julian Seward Date: Fri, 5 Sep 2014 21:11:18 +0000 (+0000) Subject: Improved argument checking for sys_kcmp. Derived from patch from X-Git-Tag: svn/VALGRIND_3_10_0~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50618eb0247326346cf7107dabf91a327cac8eac;p=thirdparty%2Fvalgrind.git 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 --- diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index fd5bf0c9ac..bcd00f1cdf 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -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 diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 027ce7e232..d7196604df 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -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 /*--------------------------------------------------------------------*/