os: Assume all supported non-WIN32 platforms have seteuid & saved_ids
Removes fallback code to fork and exec a "cat" command to read files. Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
This commit is contained in:
parent
b3b86ae674
commit
a8bb924af1
|
@ -65,9 +65,6 @@
|
|||
#include <sys/wait.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(HAVE_SETEUID) && defined(_POSIX_SAVED_IDS) && _POSIX_SAVED_IDS > 0
|
||||
#define HAS_SAVED_IDS_AND_SETEUID
|
||||
#endif
|
||||
#if defined(WIN32)
|
||||
#define HAS_NO_UIDS
|
||||
#endif
|
||||
|
@ -133,38 +130,6 @@ xf86writeConfigFile(const char *filename, XF86ConfigPtr cptr)
|
|||
int ret;
|
||||
|
||||
if (getuid() != geteuid()) {
|
||||
|
||||
#if !defined(HAS_SAVED_IDS_AND_SETEUID)
|
||||
int pid, p;
|
||||
int status;
|
||||
void (*csig) (int);
|
||||
|
||||
/* Need to fork to change ruid without losing euid */
|
||||
csig = OsSignal(SIGCHLD, SIG_DFL);
|
||||
switch ((pid = fork())) {
|
||||
case -1:
|
||||
ErrorF("xf86writeConfigFile(): fork failed (%s)\n",
|
||||
strerror(errno));
|
||||
return 0;
|
||||
case 0: /* child */
|
||||
if (setuid(getuid()) == -1)
|
||||
FatalError("xf86writeConfigFile(): "
|
||||
"setuid failed(%s)\n", strerror(errno));
|
||||
ret = doWriteConfigFile(filename, cptr);
|
||||
exit(ret);
|
||||
break;
|
||||
default: /* parent */
|
||||
do {
|
||||
p = waitpid(pid, &status, 0);
|
||||
} while (p == -1 && errno == EINTR);
|
||||
}
|
||||
OsSignal(SIGCHLD, csig);
|
||||
if (p != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0)
|
||||
return 1; /* success */
|
||||
else
|
||||
return 0;
|
||||
|
||||
#else /* HAS_SAVED_IDS_AND_SETEUID */
|
||||
int ruid, euid;
|
||||
|
||||
ruid = getuid();
|
||||
|
@ -182,9 +147,6 @@ xf86writeConfigFile(const char *filename, XF86ConfigPtr cptr)
|
|||
euid, strerror(errno));
|
||||
}
|
||||
return ret;
|
||||
|
||||
#endif /* HAS_SAVED_IDS_AND_SETEUID */
|
||||
|
||||
}
|
||||
else
|
||||
#endif /* !HAS_NO_UIDS */
|
||||
|
|
81
os/utils.c
81
os/utils.c
|
@ -202,10 +202,6 @@ char *SeatId = NULL;
|
|||
|
||||
sig_atomic_t inSignalContext = FALSE;
|
||||
|
||||
#if defined(SVR4) || defined(__linux__) || defined(CSRG_BASED)
|
||||
#define HAS_SAVED_IDS_AND_SETEUID
|
||||
#endif
|
||||
|
||||
#ifdef MONOTONIC_CLOCK
|
||||
static clockid_t clockid;
|
||||
#endif
|
||||
|
@ -1518,78 +1514,6 @@ void *
|
|||
Fopen(const char *file, const char *type)
|
||||
{
|
||||
FILE *iop;
|
||||
|
||||
#ifndef HAS_SAVED_IDS_AND_SETEUID
|
||||
struct pid *cur;
|
||||
int pdes[2], pid;
|
||||
|
||||
if (file == NULL || type == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((*type != 'r' && *type != 'w') || type[1])
|
||||
return NULL;
|
||||
|
||||
if ((cur = malloc(sizeof(struct pid))) == NULL)
|
||||
return NULL;
|
||||
|
||||
if (pipe(pdes) < 0) {
|
||||
free(cur);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (pid = fork()) {
|
||||
case -1: /* error */
|
||||
close(pdes[0]);
|
||||
close(pdes[1]);
|
||||
free(cur);
|
||||
return NULL;
|
||||
case 0: /* child */
|
||||
if (setgid(getgid()) == -1)
|
||||
_exit(127);
|
||||
if (setuid(getuid()) == -1)
|
||||
_exit(127);
|
||||
if (*type == 'r') {
|
||||
if (pdes[1] != 1) {
|
||||
/* stdout */
|
||||
dup2(pdes[1], 1);
|
||||
close(pdes[1]);
|
||||
}
|
||||
close(pdes[0]);
|
||||
}
|
||||
else {
|
||||
if (pdes[0] != 0) {
|
||||
/* stdin */
|
||||
dup2(pdes[0], 0);
|
||||
close(pdes[0]);
|
||||
}
|
||||
close(pdes[1]);
|
||||
}
|
||||
execl("/bin/cat", "cat", file, (char *) NULL);
|
||||
_exit(127);
|
||||
}
|
||||
|
||||
/* Avoid EINTR during stdio calls */
|
||||
OsBlockSignals();
|
||||
|
||||
/* parent */
|
||||
if (*type == 'r') {
|
||||
iop = fdopen(pdes[0], type);
|
||||
close(pdes[1]);
|
||||
}
|
||||
else {
|
||||
iop = fdopen(pdes[1], type);
|
||||
close(pdes[0]);
|
||||
}
|
||||
|
||||
cur->fp = iop;
|
||||
cur->pid = pid;
|
||||
cur->next = pidlist;
|
||||
pidlist = cur;
|
||||
|
||||
DebugF("Fopen(%s), fp = %p\n", file, iop);
|
||||
|
||||
return iop;
|
||||
#else
|
||||
int ruid, euid;
|
||||
|
||||
ruid = getuid();
|
||||
|
@ -1605,7 +1529,6 @@ Fopen(const char *file, const char *type)
|
|||
return NULL;
|
||||
}
|
||||
return iop;
|
||||
#endif /* HAS_SAVED_IDS_AND_SETEUID */
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1650,11 +1573,7 @@ Pclose(void *iop)
|
|||
int
|
||||
Fclose(void *iop)
|
||||
{
|
||||
#ifdef HAS_SAVED_IDS_AND_SETEUID
|
||||
return fclose(iop);
|
||||
#else
|
||||
return Pclose(iop);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* !WIN32 */
|
||||
|
|
Loading…
Reference in New Issue