1673dc3d4SNico Weber // RUN: %clangxx_asan -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
2673dc3d4SNico Weber // RUN: %clangxx_asan -O3 %s -o %t && not %run %t 2>&1 | FileCheck %s
3673dc3d4SNico Weber 
4*be8b3f0cSOliver Stannard // UNSUPPORTED: darwin, aarch64
5673dc3d4SNico Weber 
6673dc3d4SNico Weber #include <assert.h>
7673dc3d4SNico Weber #include <sys/wait.h>
8673dc3d4SNico Weber #include <unistd.h>
9673dc3d4SNico Weber #include <signal.h>
10673dc3d4SNico Weber 
main(int argc,char ** argv)11673dc3d4SNico Weber int main(int argc, char **argv) {
12673dc3d4SNico Weber   pid_t pid = fork();
13673dc3d4SNico Weber   if (pid) { // parent
14673dc3d4SNico Weber     int x[3];
15673dc3d4SNico Weber     int *status = x + argc * 3;
16673dc3d4SNico Weber     int res;
17673dc3d4SNico Weber 
18673dc3d4SNico Weber     siginfo_t *si = (siginfo_t*)(x + argc * 3);
19673dc3d4SNico Weber     res = waitid(P_ALL, 0, si, WEXITED | WNOHANG);
20673dc3d4SNico Weber     // CHECK: stack-buffer-overflow
21673dc3d4SNico Weber     // CHECK: {{WRITE of size .* at 0x.* thread T0}}
22673dc3d4SNico Weber     // CHECK: {{in .*waitid}}
23673dc3d4SNico Weber     // CHECK: {{in main .*waitid.cpp:}}
24673dc3d4SNico Weber     // CHECK: is located in stack of thread T0 at offset
25673dc3d4SNico Weber     // CHECK: {{in main}}
26673dc3d4SNico Weber     return res != -1;
27673dc3d4SNico Weber   }
28673dc3d4SNico Weber   // child
29673dc3d4SNico Weber   return 0;
30673dc3d4SNico Weber }
31