Make sudo_debug do a single vfprintf() which will result in a single
write call on most systems. Avoids problems with interleaved debug printf from different processes. Also remove an extraneous error case since recv() can't return a short read and add some more XXX.
This commit is contained in:
16
src/sudo.c
16
src/sudo.c
@@ -796,7 +796,9 @@ run_command(struct command_details *details, char *argv[], char *envp[])
|
|||||||
zero_bytes(fdsr, howmany(sv[0] + 1, NFDBITS) * sizeof(fd_mask));
|
zero_bytes(fdsr, howmany(sv[0] + 1, NFDBITS) * sizeof(fd_mask));
|
||||||
FD_SET(sv[0], fdsr);
|
FD_SET(sv[0], fdsr);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
/* XXX - we may get SIGCILD before the wait status from the child */
|
||||||
if (sigchld) {
|
if (sigchld) {
|
||||||
|
/* Note: this is the child, not the command we are waiting on */
|
||||||
sigchld = 0;
|
sigchld = 0;
|
||||||
do {
|
do {
|
||||||
pid = waitpid(child, &cstat.val, WNOHANG);
|
pid = waitpid(child, &cstat.val, WNOHANG);
|
||||||
@@ -818,11 +820,12 @@ run_command(struct command_details *details, char *argv[], char *envp[])
|
|||||||
/* read child status */
|
/* read child status */
|
||||||
nread = recv(sv[0], &cstat, sizeof(cstat), 0);
|
nread = recv(sv[0], &cstat, sizeof(cstat), 0);
|
||||||
if (nread == -1) {
|
if (nread == -1) {
|
||||||
|
/* XXX - could be interrupted by SIGCHLD */
|
||||||
if (errno == EINTR)
|
if (errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
} else if (nread != sizeof(cstat)) {
|
/* XXX - init cstat for failure case */
|
||||||
warningx("error reading command status");
|
|
||||||
}
|
}
|
||||||
|
sudo_debug(9, "cmdtype %d, val %d", cstat.type, cstat.val);
|
||||||
break; /* XXX */
|
break; /* XXX */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -862,14 +865,15 @@ void
|
|||||||
sudo_debug(int level, const char *fmt, ...)
|
sudo_debug(int level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
char *fmt2;
|
||||||
|
|
||||||
if (level > debug_level)
|
if (level > debug_level)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fputs(getprogname(), stderr);
|
/* Backet fmt with program name and a newline to make it a single write */
|
||||||
fputs(": ", stderr);
|
easprintf(&fmt2, "%s: %s\n", getprogname(), fmt);
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
vfprintf(stderr, fmt, ap);
|
vfprintf(stderr, fmt2, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
putc('\n', stderr);
|
efree(fmt2);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user