PRE(sys_prctl): handle PR_SET_SECCOMP.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14994 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
index e87320a..f0c9793 100644
--- a/coregrind/m_syswrap/syswrap-linux.c
+++ b/coregrind/m_syswrap/syswrap-linux.c
@@ -1018,6 +1018,21 @@
case VKI_PR_SET_PTRACER:
PRE_REG_READ2(int, "prctl", int, option, int, ptracer_process_ID);
break;
+ case VKI_PR_SET_SECCOMP:
+ /* This is a bit feeble in that it uses |option| before checking
+ it, but at least both sides of the conditional check it. */
+ if (ARG2 == VKI_SECCOMP_MODE_FILTER) {
+ PRE_REG_READ3(int, "prctl", int, option, int, mode, char*, filter);
+ if (ARG3) {
+ /* Should check that ARG3 points at a valid struct sock_fprog.
+ Sounds complex; hence be lame. */
+ PRE_MEM_READ( "prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, filter)",
+ ARG3, 1 );
+ }
+ } else {
+ PRE_REG_READ2(int, "prctl", int, option, int, mode);
+ }
+ break;
default:
PRE_REG_READ5(long, "prctl",
int, option, unsigned long, arg2, unsigned long, arg3,
diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h
index 63a0da5..a66b8bc 100644
--- a/include/vki/vki-linux.h
+++ b/include/vki/vki-linux.h
@@ -2508,6 +2508,9 @@
# define VKI_PR_ENDIAN_BIG 0
# define VKI_PR_ENDIAN_LITTLE 1 /* True little endian mode */
# define VKI_PR_ENDIAN_PPC_LITTLE 2 /* "PowerPC" pseudo little endian */
+
+#define VKI_PR_SET_SECCOMP 22
+
#define VKI_PR_SET_PTRACER 0x59616d61
//----------------------------------------------------------------------
@@ -4601,6 +4604,12 @@
VKI_KCMP_TYPES
};
+//----------------------------------------------------------------------
+// From linux-3.19-rc5/include/uapi/linux/seccomp.h
+//----------------------------------------------------------------------
+
+#define VKI_SECCOMP_MODE_FILTER 2
+
#endif // __VKI_LINUX_H
/*--------------------------------------------------------------------*/