1 /* 2 * Copyright (c) 2001 Proofpoint, Inc. and its suppliers. 3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 */ 10 11 /* 12 ** This program checks to see if your version of setreuid works. 13 ** Compile it, make it set-user-ID root, and run it as yourself (NOT as 14 ** root). If it won't compile or outputs any MAYDAY messages, don't 15 ** define HASSETREUID in conf.h. 16 ** 17 ** Compilation is trivial -- just "cc t_setreuid.c". Make it set-user-ID, 18 ** root and then execute it as a non-root user. 19 */ 20 21 #include <sys/types.h> 22 #include <unistd.h> 23 #include <stdio.h> 24 #include <stdlib.h> 25 26 #ifndef lint 27 static char id[] = "@(#)$Id: t_setreuid.c,v 8.10 2013-11-22 20:52:01 ca Exp $"; 28 #endif 29 30 #ifdef __hpux 31 # define setreuid(r, e) setresuid(r, e, -1) 32 #endif 33 34 static void 35 printuids(str, r, e) 36 char *str; 37 uid_t r, e; 38 { 39 printf("%s (should be %d/%d): r/euid=%d/%d\n", str, (int) r, (int) e, 40 (int) getuid(), (int) geteuid()); 41 } 42 43 int 44 main(argc, argv) 45 int argc; 46 char **argv; 47 { 48 int fail = 0; 49 uid_t realuid = getuid(); 50 51 printuids("initial uids", realuid, 0); 52 53 if (geteuid() != 0) 54 { 55 printf("SETUP ERROR: re-run set-user-ID root\n"); 56 exit(1); 57 } 58 59 if (getuid() == 0) 60 { 61 printf("SETUP ERROR: must be run by a non-root user\n"); 62 exit(1); 63 } 64 65 if (setreuid(0, 1) < 0) 66 { 67 fail++; 68 printf("setreuid(0, 1) failure\n"); 69 } 70 printuids("after setreuid(0, 1)", 0, 1); 71 72 if (getuid() != 0) 73 { 74 fail++; 75 printf("MAYDAY! Wrong real uid\n"); 76 } 77 78 if (geteuid() != 1) 79 { 80 fail++; 81 printf("MAYDAY! Wrong effective uid\n"); 82 } 83 84 /* do activity here */ 85 86 if (setreuid(-1, 0) < 0) 87 { 88 fail++; 89 printf("setreuid(-1, 0) failure\n"); 90 } 91 printuids("after setreuid(-1, 0)", 0, 0); 92 if (setreuid(realuid, 0) < 0) 93 { 94 fail++; 95 printf("setreuid(%d, 0) failure\n", (int) realuid); 96 } 97 printuids("after setreuid(realuid, 0)", realuid, 0); 98 99 if (geteuid() != 0) 100 { 101 fail++; 102 printf("MAYDAY! Wrong effective uid\n"); 103 } 104 if (getuid() != realuid) 105 { 106 fail++; 107 printf("MAYDAY! Wrong real uid\n"); 108 } 109 printf("\n"); 110 111 if (setreuid(0, 2) < 0) 112 { 113 fail++; 114 printf("setreuid(0, 2) failure\n"); 115 } 116 printuids("after setreuid(0, 2)", 0, 2); 117 118 if (geteuid() != 2) 119 { 120 fail++; 121 printf("MAYDAY! Wrong effective uid\n"); 122 } 123 124 if (getuid() != 0) 125 { 126 fail++; 127 printf("MAYDAY! Wrong real uid\n"); 128 } 129 130 /* do activity here */ 131 132 if (setreuid(-1, 0) < 0) 133 { 134 fail++; 135 printf("setreuid(-1, 0) failure\n"); 136 } 137 printuids("after setreuid(-1, 0)", 0, 0); 138 if (setreuid(realuid, 0) < 0) 139 { 140 fail++; 141 printf("setreuid(%d, 0) failure\n", (int) realuid); 142 } 143 printuids("after setreuid(realuid, 0)", realuid, 0); 144 145 if (geteuid() != 0) 146 { 147 fail++; 148 printf("MAYDAY! Wrong effective uid\n"); 149 } 150 if (getuid() != realuid) 151 { 152 fail++; 153 printf("MAYDAY! Wrong real uid\n"); 154 } 155 156 if (fail) 157 { 158 printf("\nThis system cannot use setreuid\n"); 159 exit(1); 160 } 161 162 printf("\nIt is safe to define HASSETREUID on this system\n"); 163 exit(0); 164 } 165