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
/*--------------------------------------------------------------------*/