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