15dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <stdlib.h> 25dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <stddef.h> 35dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <unistd.h> 45dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <signal.h> 55dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <sys/types.h> 65dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <sys/socket.h> 75dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <stdio.h> 85dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes#include <sys/wait.h> 95dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 105dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesstatic const struct sockaddr sa; 115dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 125dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughesint main(int argc, char *argv[]) 135dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes{ 145dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes int loops; 155dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes int pid; 165dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes sigset_t set; 175dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 185dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes printf( 195dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes"Please run me under 'strace -f -oLOG', and examine LOG file for incorrect\n" 205dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes"decoding of interrupted syscalls: grep for 'sendto', '??" /* anti-trigraph gap */ "?', 'unavailable'.\n" 215dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes"Pass number of iterations in argv[1] (default: 999).\n" 225dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes ); 235dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes fflush(NULL); 245dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 255dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes sigemptyset(&set); 265dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes sigaddset(&set, SIGCHLD); 275dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes sigprocmask(SIG_BLOCK, &set, NULL); 285dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 295dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes loops = 999; 305dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes if (argv[1]) 315dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes loops = atoi(argv[1]); 325dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 335dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes while (--loops >= 0) { 345dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes pid = fork(); 355dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 365dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes if (pid < 0) 375dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes exit(1); 385dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 395dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes if (!pid) { 405dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes /* child */ 415dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes int child = getpid(); 425dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 435dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes loops = 99; 445dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes while (--loops) { 455dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes pid = fork(); 465dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 475dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes if (pid < 0) 485dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes exit(1); 495dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 505dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes if (!pid) { 515dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes /* grandchild: kill child */ 525dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes kill(child, SIGKILL); 535dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes exit(0); 545dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes } 555dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 565dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes /* Add various syscalls you want to test here. 575dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * strace will decode them and suddenly find 585dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * process disappearing. 595dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * But leave at least one case "empty", so that 605dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * "kill grandchild" happens quicker. 615dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * This produces cases when strace can't even 625dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes * decode syscall number before process dies. 635dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes */ 645dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes switch (loops & 1) { 655dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes case 0: 665dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes break; /* intentionally empty */ 675dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes case 1: 685dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes sendto(-1, "Hello cruel world", 17, 0, &sa, sizeof(sa)); 695dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes break; 705dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes } 715dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 725dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes /* kill grandchild */ 735dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes kill(pid, SIGKILL); 745dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes } 755dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 765dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes exit(0); 775dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes } 785dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 795dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes /* parent */ 805dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes wait(NULL); 815dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes } 825dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes 835dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes return 0; 845dec78d0c2663930cd1bbcecbbcee47f68bc52f3Elliott Hughes} 85