1 /*
2 **  This program checks to see if your version of setreuid works.
3 **  Compile it, make it setuid root, and run it as yourself (NOT as
4 **  root).  If it won't compile or outputs any MAYDAY messages, don't
5 **  define HASSETREUID in conf.h.
6 **
7 **  Compilation is trivial -- just "cc t_setreuid.c".
8 */
9 
10 #include <sys/types.h>
11 #include <unistd.h>
12 #include <stdio.h>
13 
14 #ifdef __hpux
15 #define setreuid(r, e)	setresuid(r, e, -1)
16 #endif
17 
main()18 main()
19 {
20 	uid_t realuid = getuid();
21 
22 	printuids("initial uids", realuid, 0);
23 
24 	if (geteuid() != 0)
25 	{
26 		printf("re-run setuid root\n");
27 		exit(1);
28 	}
29 
30 	if (setreuid(0, 1) < 0)
31 		printf("setreuid(0, 1) failure\n");
32 	printuids("after setreuid(0, 1)", 0, 1);
33 
34 	if (geteuid() != 1)
35 		printf("MAYDAY!  Wrong effective uid\n");
36 
37 	/* do activity here */
38 
39 	if (setreuid(-1, 0) < 0)
40 		printf("setreuid(-1, 0) failure\n");
41 	printuids("after setreuid(-1, 0)", 0, 0);
42 	if (setreuid(realuid, 0) < 0)
43 		printf("setreuid(%d, 0) failure\n", realuid);
44 	printuids("after setreuid(realuid, 0)", realuid, 0);
45 
46 	if (geteuid() != 0)
47 		printf("MAYDAY!  Wrong effective uid\n");
48 	if (getuid() != realuid)
49 		printf("MAYDAY!  Wrong real uid\n");
50 	printf("\n");
51 
52 	if (setreuid(0, 2) < 0)
53 		printf("setreuid(0, 2) failure\n");
54 	printuids("after setreuid(0, 2)", 0, 2);
55 
56 	if (geteuid() != 2)
57 		printf("MAYDAY!  Wrong effective uid\n");
58 
59 	/* do activity here */
60 
61 	if (setreuid(-1, 0) < 0)
62 		printf("setreuid(-1, 0) failure\n");
63 	printuids("after setreuid(-1, 0)", 0, 0);
64 	if (setreuid(realuid, 0) < 0)
65 		printf("setreuid(%d, 0) failure\n", realuid);
66 	printuids("after setreuid(realuid, 0)", realuid, 0);
67 
68 	if (geteuid() != 0)
69 		printf("MAYDAY!  Wrong effective uid\n");
70 	if (getuid() != realuid)
71 		printf("MAYDAY!  Wrong real uid\n");
72 
73 	exit(0);
74 }
75 
printuids(str,r,e)76 printuids(str, r, e)
77 	char *str;
78 	int r, e;
79 {
80 	printf("%s (should be %d/%d): r/euid=%d/%d\n", str, r, e,
81 		getuid(), geteuid());
82 }
83