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