xref: /freebsd/contrib/sendmail/test/t_seteuid.c (revision 06f25ae9f1d6020a600a10f713046203d1a82570)
1c2aa98e2SPeter Wemm /*
2c2aa98e2SPeter Wemm **  This program checks to see if your version of seteuid works.
3c2aa98e2SPeter Wemm **  Compile it, make it setuid root, and run it as yourself (NOT as
4c2aa98e2SPeter Wemm **  root).  If it won't compile or outputs any MAYDAY messages, don't
5c2aa98e2SPeter Wemm **  define USESETEUID in conf.h.
6c2aa98e2SPeter Wemm **
7c2aa98e2SPeter Wemm **	NOTE:  It is not sufficient to have seteuid in your library.
8c2aa98e2SPeter Wemm **	You must also have saved uids that function properly.
9c2aa98e2SPeter Wemm **
10c2aa98e2SPeter Wemm **  Compilation is trivial -- just "cc t_seteuid.c".  Make it setuid,
11c2aa98e2SPeter Wemm **  root and then execute it as a non-root user.
12c2aa98e2SPeter Wemm */
13c2aa98e2SPeter Wemm 
14c2aa98e2SPeter Wemm #include <sys/types.h>
15c2aa98e2SPeter Wemm #include <unistd.h>
16c2aa98e2SPeter Wemm #include <stdio.h>
17c2aa98e2SPeter Wemm 
1806f25ae9SGregory Neil Shapiro #ifndef lint
1906f25ae9SGregory Neil Shapiro static char id[] = "@(#)$Id: t_seteuid.c,v 8.4 1999/08/28 00:25:28 gshapiro Exp $";
2006f25ae9SGregory Neil Shapiro #endif /* ! lint */
2106f25ae9SGregory Neil Shapiro 
22c2aa98e2SPeter Wemm #ifdef __hpux
23c2aa98e2SPeter Wemm # define seteuid(e)	setresuid(-1, e, -1)
2406f25ae9SGregory Neil Shapiro #endif /* __hpux */
25c2aa98e2SPeter Wemm 
2606f25ae9SGregory Neil Shapiro static void
2706f25ae9SGregory Neil Shapiro printuids(str, r, e)
2806f25ae9SGregory Neil Shapiro 	char *str;
2906f25ae9SGregory Neil Shapiro 	int r, e;
3006f25ae9SGregory Neil Shapiro {
3106f25ae9SGregory Neil Shapiro 	printf("%s (should be %d/%d): r/euid=%d/%d\n", str, r, e,
3206f25ae9SGregory Neil Shapiro 		getuid(), geteuid());
3306f25ae9SGregory Neil Shapiro }
3406f25ae9SGregory Neil Shapiro 
3506f25ae9SGregory Neil Shapiro int
3606f25ae9SGregory Neil Shapiro main(argc, argv)
3706f25ae9SGregory Neil Shapiro 	int argc;
3806f25ae9SGregory Neil Shapiro 	char **argv;
39c2aa98e2SPeter Wemm {
40c2aa98e2SPeter Wemm 	int fail = 0;
41c2aa98e2SPeter Wemm 	uid_t realuid = getuid();
42c2aa98e2SPeter Wemm 
43c2aa98e2SPeter Wemm 	printuids("initial uids", realuid, 0);
44c2aa98e2SPeter Wemm 
45c2aa98e2SPeter Wemm 	if (geteuid() != 0)
46c2aa98e2SPeter Wemm 	{
47c2aa98e2SPeter Wemm 		printf("SETUP ERROR: re-run setuid root\n");
48c2aa98e2SPeter Wemm 		exit(1);
49c2aa98e2SPeter Wemm 	}
50c2aa98e2SPeter Wemm 
51c2aa98e2SPeter Wemm 	if (getuid() == 0)
52c2aa98e2SPeter Wemm 	{
53c2aa98e2SPeter Wemm 		printf("SETUP ERROR: must be run by a non-root user\n");
54c2aa98e2SPeter Wemm 		exit(1);
55c2aa98e2SPeter Wemm 	}
56c2aa98e2SPeter Wemm 
57c2aa98e2SPeter Wemm 	if (seteuid(1) < 0)
58c2aa98e2SPeter Wemm 		printf("seteuid(1) failure\n");
59c2aa98e2SPeter Wemm 	printuids("after seteuid(1)", realuid, 1);
60c2aa98e2SPeter Wemm 
61c2aa98e2SPeter Wemm 	if (geteuid() != 1)
62c2aa98e2SPeter Wemm 	{
63c2aa98e2SPeter Wemm 		fail++;
64c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
65c2aa98e2SPeter Wemm 	}
66c2aa98e2SPeter Wemm 
67c2aa98e2SPeter Wemm 	/* do activity here */
68c2aa98e2SPeter Wemm 
69c2aa98e2SPeter Wemm 	if (seteuid(0) < 0)
70c2aa98e2SPeter Wemm 	{
71c2aa98e2SPeter Wemm 		fail++;
72c2aa98e2SPeter Wemm 		printf("seteuid(0) failure\n");
73c2aa98e2SPeter Wemm 	}
74c2aa98e2SPeter Wemm 	printuids("after seteuid(0)", realuid, 0);
75c2aa98e2SPeter Wemm 
76c2aa98e2SPeter Wemm 	if (geteuid() != 0)
77c2aa98e2SPeter Wemm 	{
78c2aa98e2SPeter Wemm 		fail++;
79c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
80c2aa98e2SPeter Wemm 	}
81c2aa98e2SPeter Wemm 	if (getuid() != realuid)
82c2aa98e2SPeter Wemm 	{
83c2aa98e2SPeter Wemm 		fail++;
84c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong real uid\n");
85c2aa98e2SPeter Wemm 	}
86c2aa98e2SPeter Wemm 	printf("\n");
87c2aa98e2SPeter Wemm 
88c2aa98e2SPeter Wemm 	if (seteuid(2) < 0)
89c2aa98e2SPeter Wemm 	{
90c2aa98e2SPeter Wemm 		fail++;
91c2aa98e2SPeter Wemm 		printf("seteuid(2) failure\n");
92c2aa98e2SPeter Wemm 	}
93c2aa98e2SPeter Wemm 	printuids("after seteuid(2)", realuid, 2);
94c2aa98e2SPeter Wemm 
95c2aa98e2SPeter Wemm 	if (geteuid() != 2)
96c2aa98e2SPeter Wemm 	{
97c2aa98e2SPeter Wemm 		fail++;
98c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
99c2aa98e2SPeter Wemm 	}
100c2aa98e2SPeter Wemm 
101c2aa98e2SPeter Wemm 	/* do activity here */
102c2aa98e2SPeter Wemm 
103c2aa98e2SPeter Wemm 	if (seteuid(0) < 0)
104c2aa98e2SPeter Wemm 	{
105c2aa98e2SPeter Wemm 		fail++;
106c2aa98e2SPeter Wemm 		printf("seteuid(0) failure\n");
107c2aa98e2SPeter Wemm 	}
108c2aa98e2SPeter Wemm 	printuids("after seteuid(0)", realuid, 0);
109c2aa98e2SPeter Wemm 
110c2aa98e2SPeter Wemm 	if (geteuid() != 0)
111c2aa98e2SPeter Wemm 	{
112c2aa98e2SPeter Wemm 		fail++;
113c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
114c2aa98e2SPeter Wemm 	}
115c2aa98e2SPeter Wemm 	if (getuid() != realuid)
116c2aa98e2SPeter Wemm 	{
117c2aa98e2SPeter Wemm 		fail++;
118c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong real uid\n");
119c2aa98e2SPeter Wemm 	}
120c2aa98e2SPeter Wemm 
121c2aa98e2SPeter Wemm 	if (fail)
122c2aa98e2SPeter Wemm 	{
123c2aa98e2SPeter Wemm 		printf("\nThis system cannot use seteuid\n");
124c2aa98e2SPeter Wemm 		exit(1);
125c2aa98e2SPeter Wemm 	}
126c2aa98e2SPeter Wemm 
127c2aa98e2SPeter Wemm 	printf("\nIt is safe to define USESETEUID on this system\n");
128c2aa98e2SPeter Wemm 	exit(0);
129c2aa98e2SPeter Wemm }
130