xref: /freebsd/contrib/sendmail/test/t_seteuid.c (revision 5dd76dd0cc19450133aa379ce0ce4a68ae07fb39)
1c2aa98e2SPeter Wemm /*
2*5dd76dd0SGregory Neil Shapiro  * Copyright (c) 1999-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 seteuid 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 USESETEUID in conf.h.
16c2aa98e2SPeter Wemm **
17c2aa98e2SPeter Wemm **	NOTE:  It is not sufficient to have seteuid in your library.
18c2aa98e2SPeter Wemm **	You must also have saved uids that function properly.
19c2aa98e2SPeter Wemm **
2040266059SGregory Neil Shapiro **  Compilation is trivial -- just "cc t_seteuid.c".  Make it set-user-ID
21c2aa98e2SPeter Wemm **  root and then execute it as a non-root user.
22c2aa98e2SPeter Wemm */
23c2aa98e2SPeter Wemm 
24c2aa98e2SPeter Wemm #include <sys/types.h>
25c2aa98e2SPeter Wemm #include <unistd.h>
26c2aa98e2SPeter Wemm #include <stdio.h>
27c2aa98e2SPeter Wemm 
2806f25ae9SGregory Neil Shapiro #ifndef lint
29*5dd76dd0SGregory Neil Shapiro static char id[] = "@(#)$Id: t_seteuid.c,v 8.9 2013/11/22 20:52:01 ca Exp $";
3006f25ae9SGregory Neil Shapiro #endif /* ! lint */
3106f25ae9SGregory Neil Shapiro 
32c2aa98e2SPeter Wemm #ifdef __hpux
33c2aa98e2SPeter Wemm # define seteuid(e)	setresuid(-1, e, -1)
3406f25ae9SGregory Neil Shapiro #endif /* __hpux */
35c2aa98e2SPeter Wemm 
3606f25ae9SGregory Neil Shapiro static void
3706f25ae9SGregory Neil Shapiro printuids(str, r, e)
3806f25ae9SGregory Neil Shapiro 	char *str;
3940266059SGregory Neil Shapiro 	uid_t r, e;
4006f25ae9SGregory Neil Shapiro {
4140266059SGregory Neil Shapiro 	printf("%s (should be %d/%d): r/euid=%d/%d\n", str, (int) r, (int) e,
4240266059SGregory Neil Shapiro 	       (int) getuid(), (int) geteuid());
4306f25ae9SGregory Neil Shapiro }
4406f25ae9SGregory Neil Shapiro 
4506f25ae9SGregory Neil Shapiro int
4606f25ae9SGregory Neil Shapiro main(argc, argv)
4706f25ae9SGregory Neil Shapiro 	int argc;
4806f25ae9SGregory Neil Shapiro 	char **argv;
49c2aa98e2SPeter Wemm {
50c2aa98e2SPeter Wemm 	int fail = 0;
51c2aa98e2SPeter Wemm 	uid_t realuid = getuid();
52c2aa98e2SPeter Wemm 
53c2aa98e2SPeter Wemm 	printuids("initial uids", realuid, 0);
54c2aa98e2SPeter Wemm 
55c2aa98e2SPeter Wemm 	if (geteuid() != 0)
56c2aa98e2SPeter Wemm 	{
5740266059SGregory Neil Shapiro 		printf("SETUP ERROR: re-run set-user-ID root\n");
58c2aa98e2SPeter Wemm 		exit(1);
59c2aa98e2SPeter Wemm 	}
60c2aa98e2SPeter Wemm 
61c2aa98e2SPeter Wemm 	if (getuid() == 0)
62c2aa98e2SPeter Wemm 	{
63c2aa98e2SPeter Wemm 		printf("SETUP ERROR: must be run by a non-root user\n");
64c2aa98e2SPeter Wemm 		exit(1);
65c2aa98e2SPeter Wemm 	}
66c2aa98e2SPeter Wemm 
67c2aa98e2SPeter Wemm 	if (seteuid(1) < 0)
68c2aa98e2SPeter Wemm 		printf("seteuid(1) failure\n");
69c2aa98e2SPeter Wemm 	printuids("after seteuid(1)", realuid, 1);
70c2aa98e2SPeter Wemm 
71c2aa98e2SPeter Wemm 	if (geteuid() != 1)
72c2aa98e2SPeter Wemm 	{
73c2aa98e2SPeter Wemm 		fail++;
74c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
75c2aa98e2SPeter Wemm 	}
76c2aa98e2SPeter Wemm 
77c2aa98e2SPeter Wemm 	/* do activity here */
78c2aa98e2SPeter Wemm 
79c2aa98e2SPeter Wemm 	if (seteuid(0) < 0)
80c2aa98e2SPeter Wemm 	{
81c2aa98e2SPeter Wemm 		fail++;
82c2aa98e2SPeter Wemm 		printf("seteuid(0) failure\n");
83c2aa98e2SPeter Wemm 	}
84c2aa98e2SPeter Wemm 	printuids("after seteuid(0)", realuid, 0);
85c2aa98e2SPeter Wemm 
86c2aa98e2SPeter Wemm 	if (geteuid() != 0)
87c2aa98e2SPeter Wemm 	{
88c2aa98e2SPeter Wemm 		fail++;
89c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
90c2aa98e2SPeter Wemm 	}
91c2aa98e2SPeter Wemm 	if (getuid() != realuid)
92c2aa98e2SPeter Wemm 	{
93c2aa98e2SPeter Wemm 		fail++;
94c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong real uid\n");
95c2aa98e2SPeter Wemm 	}
96c2aa98e2SPeter Wemm 	printf("\n");
97c2aa98e2SPeter Wemm 
98c2aa98e2SPeter Wemm 	if (seteuid(2) < 0)
99c2aa98e2SPeter Wemm 	{
100c2aa98e2SPeter Wemm 		fail++;
101c2aa98e2SPeter Wemm 		printf("seteuid(2) failure\n");
102c2aa98e2SPeter Wemm 	}
103c2aa98e2SPeter Wemm 	printuids("after seteuid(2)", realuid, 2);
104c2aa98e2SPeter Wemm 
105c2aa98e2SPeter Wemm 	if (geteuid() != 2)
106c2aa98e2SPeter Wemm 	{
107c2aa98e2SPeter Wemm 		fail++;
108c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
109c2aa98e2SPeter Wemm 	}
110c2aa98e2SPeter Wemm 
111c2aa98e2SPeter Wemm 	/* do activity here */
112c2aa98e2SPeter Wemm 
113c2aa98e2SPeter Wemm 	if (seteuid(0) < 0)
114c2aa98e2SPeter Wemm 	{
115c2aa98e2SPeter Wemm 		fail++;
116c2aa98e2SPeter Wemm 		printf("seteuid(0) failure\n");
117c2aa98e2SPeter Wemm 	}
118c2aa98e2SPeter Wemm 	printuids("after seteuid(0)", realuid, 0);
119c2aa98e2SPeter Wemm 
120c2aa98e2SPeter Wemm 	if (geteuid() != 0)
121c2aa98e2SPeter Wemm 	{
122c2aa98e2SPeter Wemm 		fail++;
123c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong effective uid\n");
124c2aa98e2SPeter Wemm 	}
125c2aa98e2SPeter Wemm 	if (getuid() != realuid)
126c2aa98e2SPeter Wemm 	{
127c2aa98e2SPeter Wemm 		fail++;
128c2aa98e2SPeter Wemm 		printf("MAYDAY!  Wrong real uid\n");
129c2aa98e2SPeter Wemm 	}
130c2aa98e2SPeter Wemm 
131c2aa98e2SPeter Wemm 	if (fail)
132c2aa98e2SPeter Wemm 	{
133c2aa98e2SPeter Wemm 		printf("\nThis system cannot use seteuid\n");
134c2aa98e2SPeter Wemm 		exit(1);
135c2aa98e2SPeter Wemm 	}
136c2aa98e2SPeter Wemm 
137c2aa98e2SPeter Wemm 	printf("\nIt is safe to define USESETEUID on this system\n");
138c2aa98e2SPeter Wemm 	exit(0);
139c2aa98e2SPeter Wemm }
140