xref: /freebsd/contrib/sendmail/test/t_setreuid.c (revision 2fb4f839f3fc72ce2bab12f9ba4760f97f73e97f)
1c2aa98e2SPeter Wemm /*
25dd76dd0SGregory Neil Shapiro  * Copyright (c) 2001 Proofpoint, Inc. and its suppliers.
340266059SGregory Neil Shapiro  *	All rights reserved.
440266059SGregory Neil Shapiro  *
540266059SGregory Neil Shapiro  * By using this file, you agree to the terms and conditions set
640266059SGregory Neil Shapiro  * forth in the LICENSE file which can be found at the top level of
740266059SGregory Neil Shapiro  * the sendmail distribution.
840266059SGregory Neil Shapiro  *
940266059SGregory Neil Shapiro  */
1040266059SGregory Neil Shapiro 
1140266059SGregory Neil Shapiro /*
12c2aa98e2SPeter Wemm **  This program checks to see if your version of setreuid works.
1340266059SGregory Neil Shapiro **  Compile it, make it set-user-ID root, and run it as yourself (NOT as
14c2aa98e2SPeter Wemm **  root).  If it won't compile or outputs any MAYDAY messages, don't
15c2aa98e2SPeter Wemm **  define HASSETREUID in conf.h.
16c2aa98e2SPeter Wemm **
1740266059SGregory Neil Shapiro **  Compilation is trivial -- just "cc t_setreuid.c".  Make it set-user-ID,
18c2aa98e2SPeter Wemm **  root and then execute it as a non-root user.
19c2aa98e2SPeter Wemm */
20c2aa98e2SPeter Wemm 
21c2aa98e2SPeter Wemm #include <sys/types.h>
22c2aa98e2SPeter Wemm #include <unistd.h>
23c2aa98e2SPeter Wemm #include <stdio.h>
24*2fb4f839SGregory Neil Shapiro #include <stdlib.h>
25c2aa98e2SPeter Wemm 
2606f25ae9SGregory Neil Shapiro #ifndef lint
274313cc83SGregory Neil Shapiro static char id[] = "@(#)$Id: t_setreuid.c,v 8.10 2013-11-22 20:52:01 ca Exp $";
28*2fb4f839SGregory Neil Shapiro #endif
2906f25ae9SGregory Neil Shapiro 
30c2aa98e2SPeter Wemm #ifdef __hpux
31c2aa98e2SPeter Wemm # define setreuid(r, e)	setresuid(r, e, -1)
32*2fb4f839SGregory Neil Shapiro #endif
33c2aa98e2SPeter Wemm 
3406f25ae9SGregory Neil Shapiro static void
printuids(str,r,e)3506f25ae9SGregory Neil Shapiro printuids(str, r, e)
3606f25ae9SGregory Neil Shapiro 	char *str;
3740266059SGregory Neil Shapiro 	uid_t r, e;
3806f25ae9SGregory Neil Shapiro {
3940266059SGregory Neil Shapiro 	printf("%s (should be %d/%d): r/euid=%d/%d\n", str, (int) r, (int) e,
4040266059SGregory Neil Shapiro 	       (int) getuid(), (int) geteuid());
4106f25ae9SGregory Neil Shapiro }
4206f25ae9SGregory Neil Shapiro 
4306f25ae9SGregory Neil Shapiro int
main(argc,argv)4406f25ae9SGregory Neil Shapiro main(argc, argv)
4506f25ae9SGregory Neil Shapiro 	int argc;
4606f25ae9SGregory Neil Shapiro 	char **argv;
47c2aa98e2SPeter Wemm {
48c2aa98e2SPeter Wemm 	int fail = 0;
49c2aa98e2SPeter Wemm 	uid_t realuid = getuid();
50c2aa98e2SPeter Wemm 
51c2aa98e2SPeter Wemm 	printuids("initial uids", realuid, 0);
52c2aa98e2SPeter Wemm 
53c2aa98e2SPeter Wemm 	if (geteuid() != 0)
54c2aa98e2SPeter Wemm 	{
5540266059SGregory Neil Shapiro 		printf("SETUP ERROR: re-run set-user-ID root\n");
56c2aa98e2SPeter Wemm 		exit(1);
57c2aa98e2SPeter Wemm 	}
58c2aa98e2SPeter Wemm 
59c2aa98e2SPeter Wemm 	if (getuid() == 0)
60c2aa98e2SPeter Wemm 	{
61c2aa98e2SPeter Wemm 		printf("SETUP ERROR: must be run by a non-root user\n");
62c2aa98e2SPeter Wemm 		exit(1);
63c2aa98e2SPeter Wemm 	}
64c2aa98e2SPeter Wemm 
65c2aa98e2SPeter Wemm 	if (setreuid(0, 1) < 0)
66c2aa98e2SPeter Wemm 	{
67c2aa98e2SPeter Wemm 		fail++;
68c2aa98e2SPeter Wemm 		printf("setreuid(0, 1) failure\n");
69c2aa98e2SPeter Wemm 	}
70c2aa98e2SPeter Wemm 	printuids("after setreuid(0, 1)", 0, 1);
71c2aa98e2SPeter Wemm 
7240266059SGregory Neil Shapiro 	if (getuid() != 0)
7340266059SGregory Neil Shapiro 	{
7440266059SGregory Neil Shapiro 		fail++;
7540266059SGregory Neil Shapiro 		printf("MAYDAY!  Wrong real uid\n");
7640266059SGregory Neil Shapiro 	}
7740266059SGregory Neil Shapiro 
78c2aa98e2SPeter Wemm 	if (geteuid() != 1)
79c2aa98e2SPeter Wemm 	{
80c2aa98e2SPeter Wemm 		fail++;
81c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
82c2aa98e2SPeter Wemm 	}
83c2aa98e2SPeter Wemm 
84c2aa98e2SPeter Wemm 	/* do activity here */
85c2aa98e2SPeter Wemm 
86c2aa98e2SPeter Wemm 	if (setreuid(-1, 0) < 0)
87c2aa98e2SPeter Wemm 	{
88c2aa98e2SPeter Wemm 		fail++;
89c2aa98e2SPeter Wemm 		printf("setreuid(-1, 0) failure\n");
90c2aa98e2SPeter Wemm 	}
91c2aa98e2SPeter Wemm 	printuids("after setreuid(-1, 0)", 0, 0);
92c2aa98e2SPeter Wemm 	if (setreuid(realuid, 0) < 0)
93c2aa98e2SPeter Wemm 	{
94c2aa98e2SPeter Wemm 		fail++;
9540266059SGregory Neil Shapiro 		printf("setreuid(%d, 0) failure\n", (int) realuid);
96c2aa98e2SPeter Wemm 	}
97c2aa98e2SPeter Wemm 	printuids("after setreuid(realuid, 0)", realuid, 0);
98c2aa98e2SPeter Wemm 
99c2aa98e2SPeter Wemm 	if (geteuid() != 0)
100c2aa98e2SPeter Wemm 	{
101c2aa98e2SPeter Wemm 		fail++;
102c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
103c2aa98e2SPeter Wemm 	}
104c2aa98e2SPeter Wemm 	if (getuid() != realuid)
105c2aa98e2SPeter Wemm 	{
106c2aa98e2SPeter Wemm 		fail++;
107c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong real uid\n");
108c2aa98e2SPeter Wemm 	}
109c2aa98e2SPeter Wemm 	printf("\n");
110c2aa98e2SPeter Wemm 
111c2aa98e2SPeter Wemm 	if (setreuid(0, 2) < 0)
112c2aa98e2SPeter Wemm 	{
113c2aa98e2SPeter Wemm 		fail++;
114c2aa98e2SPeter Wemm 		printf("setreuid(0, 2) failure\n");
115c2aa98e2SPeter Wemm 	}
116c2aa98e2SPeter Wemm 	printuids("after setreuid(0, 2)", 0, 2);
117c2aa98e2SPeter Wemm 
118c2aa98e2SPeter Wemm 	if (geteuid() != 2)
119c2aa98e2SPeter Wemm 	{
120c2aa98e2SPeter Wemm 		fail++;
121c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
122c2aa98e2SPeter Wemm 	}
123c2aa98e2SPeter Wemm 
12440266059SGregory Neil Shapiro 	if (getuid() != 0)
12540266059SGregory Neil Shapiro 	{
12640266059SGregory Neil Shapiro 		fail++;
12740266059SGregory Neil Shapiro 		printf("MAYDAY!  Wrong real uid\n");
12840266059SGregory Neil Shapiro 	}
12940266059SGregory Neil Shapiro 
130c2aa98e2SPeter Wemm 	/* do activity here */
131c2aa98e2SPeter Wemm 
132c2aa98e2SPeter Wemm 	if (setreuid(-1, 0) < 0)
133c2aa98e2SPeter Wemm 	{
134c2aa98e2SPeter Wemm 		fail++;
135c2aa98e2SPeter Wemm 		printf("setreuid(-1, 0) failure\n");
136c2aa98e2SPeter Wemm 	}
137c2aa98e2SPeter Wemm 	printuids("after setreuid(-1, 0)", 0, 0);
138c2aa98e2SPeter Wemm 	if (setreuid(realuid, 0) < 0)
139c2aa98e2SPeter Wemm 	{
140c2aa98e2SPeter Wemm 		fail++;
14140266059SGregory Neil Shapiro 		printf("setreuid(%d, 0) failure\n", (int) realuid);
142c2aa98e2SPeter Wemm 	}
143c2aa98e2SPeter Wemm 	printuids("after setreuid(realuid, 0)", realuid, 0);
144c2aa98e2SPeter Wemm 
145c2aa98e2SPeter Wemm 	if (geteuid() != 0)
146c2aa98e2SPeter Wemm 	{
147c2aa98e2SPeter Wemm 		fail++;
148c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
149c2aa98e2SPeter Wemm 	}
150c2aa98e2SPeter Wemm 	if (getuid() != realuid)
151c2aa98e2SPeter Wemm 	{
152c2aa98e2SPeter Wemm 		fail++;
153c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong real uid\n");
154c2aa98e2SPeter Wemm 	}
155c2aa98e2SPeter Wemm 
156c2aa98e2SPeter Wemm 	if (fail)
157c2aa98e2SPeter Wemm 	{
158c2aa98e2SPeter Wemm 		printf("\nThis system cannot use setreuid\n");
159c2aa98e2SPeter Wemm 		exit(1);
160c2aa98e2SPeter Wemm 	}
161c2aa98e2SPeter Wemm 
162c2aa98e2SPeter Wemm 	printf("\nIt is safe to define HASSETREUID on this system\n");
163c2aa98e2SPeter Wemm 	exit(0);
164c2aa98e2SPeter Wemm }
165