1 #define _GNU_SOURCE 2 #include <stdio.h> 3 #include <pthread.h> 4 #include <string.h> 5 #include <stdlib.h> 6 #include <sys/types.h> 7 #include <unistd.h> 8 #include <assert.h> 9 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 # if !defined(VGO_darwin) 25 pthread_setname_np(pthread_self(), threadname); 26 # else 27 pthread_setname_np(threadname); 28 # endif 29 30 bad_things(4); 31 32 return NULL; 33 } 34 35 void* child_fn_1 ( void* arg ) 36 { 37 const char* threadname = "try1"; 38 int r; 39 40 # if !defined(VGO_darwin) 41 pthread_setname_np(pthread_self(), threadname); 42 # else 43 pthread_setname_np(threadname); 44 # endif 45 46 bad_things(3); 47 48 r = pthread_create(&children[2], NULL, child_fn_2, NULL); 49 assert(!r); 50 51 r = pthread_join(children[2], NULL); 52 assert(!r); 53 54 return NULL; 55 } 56 57 void* child_fn_0 ( void* arg ) 58 { 59 int r; 60 61 bad_things(2); 62 63 r = pthread_create(&children[1], NULL, child_fn_1, NULL); 64 assert(!r); 65 66 r = pthread_join(children[1], NULL); 67 assert(!r); 68 69 return NULL; 70 } 71 72 int main(int argc, const char** argv) 73 { 74 int r; 75 76 bad_things(1); 77 78 r = pthread_create(&children[0], NULL, child_fn_0, NULL); 79 assert(!r); 80 81 r = pthread_join(children[0], NULL); 82 assert(!r); 83 84 bad_things(5); 85 86 return 0; 87 } 88 89