Home | History | Annotate | Download | only in tests
      1 #define _GNU_SOURCE
      2 #include <stdio.h>
      3 #include <pthread.h>
      4 #include <string.h>
      5 #include <stdlib.h>
      6 #include <sys/prctl.h>
      7 #include <sys/types.h>
      8 #include <unistd.h>
      9 #include <assert.h>
     10 
     11 static pthread_t children[3];
     12 
     13 void bad_things(int offset)
     14 {
     15   char* m = malloc(sizeof(char)*offset);
     16   m[offset] = 0;
     17   free(m);
     18 }
     19 
     20 void* child_fn_2 ( void* arg )
     21 {
     22   const char* threadname = "012345678901234";
     23 
     24   pthread_setname_np(pthread_self(), threadname);
     25 
     26   bad_things(4);
     27 
     28   return NULL;
     29 }
     30 
     31 void* child_fn_1 ( void* arg )
     32 {
     33   const char* threadname = "try1";
     34   int r;
     35 
     36   pthread_setname_np(pthread_self(), threadname);
     37 
     38   bad_things(3);
     39 
     40   r = pthread_create(&children[2], NULL, child_fn_2, NULL);
     41   assert(!r);
     42 
     43   r = pthread_join(children[2], NULL);
     44   assert(!r);
     45 
     46   return NULL;
     47 }
     48 
     49 void* child_fn_0 ( void* arg )
     50 {
     51   int r;
     52 
     53   bad_things(2);
     54 
     55   r = pthread_create(&children[1], NULL, child_fn_1, NULL);
     56   assert(!r);
     57 
     58   r = pthread_join(children[1], NULL);
     59   assert(!r);
     60 
     61   return NULL;
     62 }
     63 
     64 int main(int argc, const char** argv)
     65 {
     66   int r;
     67 
     68   bad_things(1);
     69 
     70   r = pthread_create(&children[0], NULL, child_fn_0, NULL);
     71   assert(!r);
     72 
     73   r = pthread_join(children[0], NULL);
     74   assert(!r);
     75 
     76   bad_things(5);
     77 
     78   return 0;
     79 }
     80 
     81