1 /* $OpenBSD: cansig.c,v 1.1 2008/06/10 18:04:31 hshoexer Exp $ */ 2 /* Written by Michael Shalayeff, 2008. Public Domain */ 3 4 #include <sys/param.h> 5 #include <signal.h> 6 #include <stdio.h> 7 #include <unistd.h> 8 #include <errno.h> 9 #include <err.h> 10 11 int 12 main() 13 { 14 pid_t pid; 15 int serrno; 16 17 if ((pid = fork()) < 0) 18 err(1, "fork"); 19 20 /* nun sex */ 21 if (!pid) { 22 if (seteuid(1)) 23 err(1, "seteuid"); 24 sleep(3); 25 return 0; 26 } 27 28 /* monk rock */ 29 sleep(1); 30 /* first see if we can still do it */ 31 if (kill(pid, 0)) { 32 serrno = errno; 33 kill(pid, SIGKILL); 34 errno = serrno; 35 err(1, "kill0"); 36 } 37 if (setreuid(1, 1)) { 38 serrno = errno; 39 kill(pid, SIGKILL); 40 errno = serrno; 41 err(1, "seteuid1"); 42 } 43 /* not allowed */ 44 if (!kill(pid, 0)) 45 errx(1, "kill1"); 46 47 /* we can't collect the remains from the kiddo */ 48 return 0; 49 } 50