[sanitizer] Fix wait4 interceptor on Android.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Wed, 12 Feb 2014 13:05:17 +0000 (13:05 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Wed, 12 Feb 2014 13:05:17 +0000 (13:05 +0000)
It's called __wait4 there.

llvm-svn: 201235

compiler-rt/lib/asan/lit_tests/TestCases/wait.cc
compiler-rt/lib/asan/lit_tests/TestCases/waitid.cc [new file with mode: 0644]
compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

index b5580dc..730221b 100644 (file)
@@ -4,9 +4,6 @@
 // RUN: %clangxx_asan -DWAITPID -O0 %s -o %t && not %t 2>&1 | FileCheck %s
 // RUN: %clangxx_asan -DWAITPID -O3 %s -o %t && not %t 2>&1 | FileCheck %s
 
-// RUN: %clangxx_asan -DWAITID -O0 %s -o %t && not %t 2>&1 | FileCheck %s
-// RUN: %clangxx_asan -DWAITID -O3 %s -o %t && not %t 2>&1 | FileCheck %s
-
 // RUN: %clangxx_asan -DWAIT3 -O0 %s -o %t && not %t 2>&1 | FileCheck %s
 // RUN: %clangxx_asan -DWAIT3 -O3 %s -o %t && not %t 2>&1 | FileCheck %s
 
@@ -19,7 +16,6 @@
 // RUN: %clangxx_asan -DWAIT4_RUSAGE -O0 %s -o %t && not %t 2>&1 | FileCheck %s
 // RUN: %clangxx_asan -DWAIT4_RUSAGE -O3 %s -o %t && not %t 2>&1 | FileCheck %s
 
-
 #include <assert.h>
 #include <sys/wait.h>
 #include <unistd.h>
@@ -34,9 +30,6 @@ int main(int argc, char **argv) {
     res = wait(status);
 #elif defined(WAITPID)
     res = waitpid(pid, status, WNOHANG);
-#elif defined(WAITID)
-    siginfo_t *si = (siginfo_t*)(x + argc * 3);
-    res = waitid(P_ALL, 0, si, WEXITED | WNOHANG);
 #elif defined(WAIT3)
     res = wait3(status, WNOHANG, NULL);
 #elif defined(WAIT4)
@@ -56,7 +49,7 @@ int main(int argc, char **argv) {
     // CHECK: {{in main .*wait.cc:}}
     // CHECK: is located in stack of thread T0 at offset
     // CHECK: {{in main}}
-    return res != -1;
+    return res == -1 ? 1 : 0;
   }
   // child
   return 0;
diff --git a/compiler-rt/lib/asan/lit_tests/TestCases/waitid.cc b/compiler-rt/lib/asan/lit_tests/TestCases/waitid.cc
new file mode 100644 (file)
index 0000000..386e710
--- /dev/null
@@ -0,0 +1,30 @@
+// RUN: %clangxx_asan -O0 %s -o %t && not %t 2>&1 | FileCheck %s
+// RUN: %clangxx_asan -O3 %s -o %t && not %t 2>&1 | FileCheck %s
+
+// No waitid on Android.
+// XFAIL: android
+
+#include <assert.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+int main(int argc, char **argv) {
+  pid_t pid = fork();
+  if (pid) { // parent
+    int x[3];
+    int *status = x + argc * 3;
+    int res;
+
+    siginfo_t *si = (siginfo_t*)(x + argc * 3);
+    res = waitid(P_ALL, 0, si, WEXITED | WNOHANG);
+    // CHECK: stack-buffer-overflow
+    // CHECK: {{WRITE of size .* at 0x.* thread T0}}
+    // CHECK: {{in .*waitid}}
+    // CHECK: {{in main .*waitid.cc:}}
+    // CHECK: is located in stack of thread T0 at offset
+    // CHECK: {{in main}}
+    return res != -1;
+  }
+  // child
+  return 0;
+}
index d7af140..e35023e 100644 (file)
@@ -1176,6 +1176,19 @@ INTERCEPTOR(int, wait3, int *status, int options, void *rusage) {
   }
   return res;
 }
+#if SANITIZER_ANDROID
+INTERCEPTOR(int, __wait4, int pid, int *status, int options, void *rusage) {
+  void *ctx;
+  COMMON_INTERCEPTOR_ENTER(ctx, __wait4, pid, status, options, rusage);
+  int res = REAL(__wait4)(pid, status, options, rusage);
+  if (res != -1) {
+    if (status) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, status, sizeof(*status));
+    if (rusage) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, rusage, struct_rusage_sz);
+  }
+  return res;
+}
+#define INIT_WAIT4 COMMON_INTERCEPT_FUNCTION(__wait4);
+#else
 INTERCEPTOR(int, wait4, int pid, int *status, int options, void *rusage) {
   void *ctx;
   COMMON_INTERCEPTOR_ENTER(ctx, wait4, pid, status, options, rusage);
@@ -1186,14 +1199,16 @@ INTERCEPTOR(int, wait4, int pid, int *status, int options, void *rusage) {
   }
   return res;
 }
+#define INIT_WAIT4 COMMON_INTERCEPT_FUNCTION(wait4);
+#endif  // SANITIZER_ANDROID
 #define INIT_WAIT                     \
   COMMON_INTERCEPT_FUNCTION(wait);    \
   COMMON_INTERCEPT_FUNCTION(waitid);  \
   COMMON_INTERCEPT_FUNCTION(waitpid); \
-  COMMON_INTERCEPT_FUNCTION(wait3);   \
-  COMMON_INTERCEPT_FUNCTION(wait4);
+  COMMON_INTERCEPT_FUNCTION(wait3);
 #else
 #define INIT_WAIT
+#define INIT_WAIT4
 #endif
 
 #if SANITIZER_INTERCEPT_INET
@@ -3284,6 +3299,7 @@ INTERCEPTOR(unsigned int, if_nametoindex, const char* ifname) {
   INIT_TIME;                               \
   INIT_GLOB;                               \
   INIT_WAIT;                               \
+  INIT_WAIT4;                              \
   INIT_INET;                               \
   INIT_PTHREAD_GETSCHEDPARAM;              \
   INIT_GETADDRINFO;                        \