xref: /openbsd/regress/sys/kern/signal/cansig/cansig.c (revision 4cfece93)
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