1 /* $OpenBSD: cansig.c,v 1.2 2021/12/13 16:56:50 deraadt Exp $ */
2 /* Written by Michael Shalayeff, 2008. Public Domain */
3
4 #include <sys/types.h>
5 #include <signal.h>
6 #include <stdio.h>
7 #include <unistd.h>
8 #include <errno.h>
9 #include <err.h>
10
11 int
main()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