1c2aa98e2SPeter Wemm /*
25dd76dd0SGregory 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>
27*2fb4f839SGregory Neil Shapiro #include <stdlib.h>
28c2aa98e2SPeter Wemm
2906f25ae9SGregory Neil Shapiro #ifndef lint
304313cc83SGregory Neil Shapiro static char id[] = "@(#)$Id: t_seteuid.c,v 8.9 2013-11-22 20:52:01 ca Exp $";
31*2fb4f839SGregory Neil Shapiro #endif
3206f25ae9SGregory Neil Shapiro
33c2aa98e2SPeter Wemm #ifdef __hpux
34c2aa98e2SPeter Wemm # define seteuid(e) setresuid(-1, e, -1)
35*2fb4f839SGregory Neil Shapiro #endif
36c2aa98e2SPeter Wemm
3706f25ae9SGregory Neil Shapiro static void
printuids(str,r,e)3806f25ae9SGregory Neil Shapiro printuids(str, r, e)
3906f25ae9SGregory Neil Shapiro char *str;
4040266059SGregory Neil Shapiro uid_t r, e;
4106f25ae9SGregory Neil Shapiro {
4240266059SGregory Neil Shapiro printf("%s (should be %d/%d): r/euid=%d/%d\n", str, (int) r, (int) e,
4340266059SGregory Neil Shapiro (int) getuid(), (int) geteuid());
4406f25ae9SGregory Neil Shapiro }
4506f25ae9SGregory Neil Shapiro
4606f25ae9SGregory Neil Shapiro int
main(argc,argv)4706f25ae9SGregory Neil Shapiro main(argc, argv)
4806f25ae9SGregory Neil Shapiro int argc;
4906f25ae9SGregory Neil Shapiro char **argv;
50c2aa98e2SPeter Wemm {
51c2aa98e2SPeter Wemm int fail = 0;
52c2aa98e2SPeter Wemm uid_t realuid = getuid();
53c2aa98e2SPeter Wemm
54c2aa98e2SPeter Wemm printuids("initial uids", realuid, 0);
55c2aa98e2SPeter Wemm
56c2aa98e2SPeter Wemm if (geteuid() != 0)
57c2aa98e2SPeter Wemm {
5840266059SGregory Neil Shapiro printf("SETUP ERROR: re-run set-user-ID root\n");
59c2aa98e2SPeter Wemm exit(1);
60c2aa98e2SPeter Wemm }
61c2aa98e2SPeter Wemm
62c2aa98e2SPeter Wemm if (getuid() == 0)
63c2aa98e2SPeter Wemm {
64c2aa98e2SPeter Wemm printf("SETUP ERROR: must be run by a non-root user\n");
65c2aa98e2SPeter Wemm exit(1);
66c2aa98e2SPeter Wemm }
67c2aa98e2SPeter Wemm
68c2aa98e2SPeter Wemm if (seteuid(1) < 0)
69c2aa98e2SPeter Wemm printf("seteuid(1) failure\n");
70c2aa98e2SPeter Wemm printuids("after seteuid(1)", realuid, 1);
71c2aa98e2SPeter Wemm
72c2aa98e2SPeter Wemm if (geteuid() != 1)
73c2aa98e2SPeter Wemm {
74c2aa98e2SPeter Wemm fail++;
75c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n");
76c2aa98e2SPeter Wemm }
77c2aa98e2SPeter Wemm
78c2aa98e2SPeter Wemm /* do activity here */
79c2aa98e2SPeter Wemm
80c2aa98e2SPeter Wemm if (seteuid(0) < 0)
81c2aa98e2SPeter Wemm {
82c2aa98e2SPeter Wemm fail++;
83c2aa98e2SPeter Wemm printf("seteuid(0) failure\n");
84c2aa98e2SPeter Wemm }
85c2aa98e2SPeter Wemm printuids("after seteuid(0)", realuid, 0);
86c2aa98e2SPeter Wemm
87c2aa98e2SPeter Wemm if (geteuid() != 0)
88c2aa98e2SPeter Wemm {
89c2aa98e2SPeter Wemm fail++;
90c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n");
91c2aa98e2SPeter Wemm }
92c2aa98e2SPeter Wemm if (getuid() != realuid)
93c2aa98e2SPeter Wemm {
94c2aa98e2SPeter Wemm fail++;
95c2aa98e2SPeter Wemm printf("MAYDAY! Wrong real uid\n");
96c2aa98e2SPeter Wemm }
97c2aa98e2SPeter Wemm printf("\n");
98c2aa98e2SPeter Wemm
99c2aa98e2SPeter Wemm if (seteuid(2) < 0)
100c2aa98e2SPeter Wemm {
101c2aa98e2SPeter Wemm fail++;
102c2aa98e2SPeter Wemm printf("seteuid(2) failure\n");
103c2aa98e2SPeter Wemm }
104c2aa98e2SPeter Wemm printuids("after seteuid(2)", realuid, 2);
105c2aa98e2SPeter Wemm
106c2aa98e2SPeter Wemm if (geteuid() != 2)
107c2aa98e2SPeter Wemm {
108c2aa98e2SPeter Wemm fail++;
109c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n");
110c2aa98e2SPeter Wemm }
111c2aa98e2SPeter Wemm
112c2aa98e2SPeter Wemm /* do activity here */
113c2aa98e2SPeter Wemm
114c2aa98e2SPeter Wemm if (seteuid(0) < 0)
115c2aa98e2SPeter Wemm {
116c2aa98e2SPeter Wemm fail++;
117c2aa98e2SPeter Wemm printf("seteuid(0) failure\n");
118c2aa98e2SPeter Wemm }
119c2aa98e2SPeter Wemm printuids("after seteuid(0)", realuid, 0);
120c2aa98e2SPeter Wemm
121c2aa98e2SPeter Wemm if (geteuid() != 0)
122c2aa98e2SPeter Wemm {
123c2aa98e2SPeter Wemm fail++;
124c2aa98e2SPeter Wemm printf("MAYDAY! Wrong effective uid\n");
125c2aa98e2SPeter Wemm }
126c2aa98e2SPeter Wemm if (getuid() != realuid)
127c2aa98e2SPeter Wemm {
128c2aa98e2SPeter Wemm fail++;
129c2aa98e2SPeter Wemm printf("MAYDAY! Wrong real uid\n");
130c2aa98e2SPeter Wemm }
131c2aa98e2SPeter Wemm
132c2aa98e2SPeter Wemm if (fail)
133c2aa98e2SPeter Wemm {
134c2aa98e2SPeter Wemm printf("\nThis system cannot use seteuid\n");
135c2aa98e2SPeter Wemm exit(1);
136c2aa98e2SPeter Wemm }
137c2aa98e2SPeter Wemm
138c2aa98e2SPeter Wemm printf("\nIt is safe to define USESETEUID on this system\n");
139c2aa98e2SPeter Wemm exit(0);
140c2aa98e2SPeter Wemm }
141