]> granicus.if.org Git - sudo/commitdiff
Log the process id in the debug file output. Since we don't want
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 6 Apr 2012 19:20:16 +0000 (15:20 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 6 Apr 2012 19:20:16 +0000 (15:20 -0400)
to keep calling getpid(), stash the value at init time and when we
fork().

common/sudo_debug.c
include/sudo_debug.h
plugins/sudoers/logging.c
plugins/sudoers/visudo.c
src/exec.c
src/exec_pty.c

index c2b12cdefd1c42bcd3bcfc98d567da6a0fcee3b3..f41fa8b4c964601f942994a45c8bf32798804b42 100644 (file)
@@ -114,6 +114,8 @@ const char *const sudo_debug_subsystems[] = {
 static int sudo_debug_settings[NUM_SUBSYSTEMS];
 static int sudo_debug_fd = -1;
 static int sudo_debug_mode;
+static char sudo_debug_pidstr[(((sizeof(int) * 8) + 2) / 3) + 3];
+static size_t sudo_debug_pidlen;
 
 extern sudo_conv_t sudo_conv;
 
@@ -174,9 +176,27 @@ int sudo_debug_init(const char *debugfile, const char *settings)
     }
     efree(buf);
 
+    (void)snprintf(sudo_debug_pidstr, sizeof(sudo_debug_pidstr), "[%d] ",
+       (int)getpid());
+    sudo_debug_pidlen = strlen(sudo_debug_pidstr);
+
     return 1;
 }
 
+pid_t
+sudo_debug_fork(void)
+{
+    pid_t pid;
+
+    if ((pid = fork()) == 0) {
+       (void)snprintf(sudo_debug_pidstr, sizeof(sudo_debug_pidstr), "[%d] ",
+           (int)getpid());
+       sudo_debug_pidlen = strlen(sudo_debug_pidstr);
+    }
+
+    return pid;
+}
+
 void
 sudo_debug_enter(const char *func, const char *file, int line,
     int subsys)
@@ -298,11 +318,11 @@ sudo_debug_write_file(const char *func, const char *file, int lineno,
     int iovcnt = 4;
     bool need_newline = false;
 
-    /* Prepend program name with trailing space. */
+    /* Prepend program name and pid with a trailing space. */
     iov[1].iov_base = (char *)getprogname();
     iov[1].iov_len = strlen(iov[1].iov_base);
-    iov[2].iov_base = " ";
-    iov[2].iov_len = 1;
+    iov[2].iov_base = sudo_debug_pidstr;
+    iov[2].iov_len = sudo_debug_pidlen;
 
     /* Add string along with newline if it doesn't have one. */
     iov[3].iov_base = (char *)str;
index 5a8a62d321a62def598617f028c70cc7a6fc5369..b7b458d12238de4baaeb5028a84ffc57570b012c 100644 (file)
@@ -203,5 +203,6 @@ int sudo_debug_init(const char *debugfile, const char *settings);
 void sudo_debug_printf2(const char *func, const char *file, int line, int level, const char *format, ...) __printflike(5, 6);
 void sudo_debug_write(const char *str, int len, int errno_val);
 void sudo_debug_write2(const char *func, const char *file, int line, const char *str, int len, int errno_val);
+pid_t sudo_debug_fork(void);
 
 #endif /* _SUDO_DEBUG_H */
index c6cff0be832fc6083ebe1b798e574ac2bde9bacd..4d3e13e47e0e9c82c20ee5021a2d87cdb6d5ca8c 100644 (file)
@@ -441,7 +441,7 @@ send_mail(const char *fmt, ...)
        debug_return;
 
     /* Fork and return, child will daemonize. */
-    switch (pid = fork()) {
+    switch (pid = sudo_debug_fork()) {
        case -1:
            /* Error. */
            error(1, _("unable to fork"));
@@ -510,7 +510,7 @@ send_mail(const char *fmt, ...)
        _exit(1);
     }
 
-    switch (pid = fork()) {
+    switch (pid = sudo_debug_fork()) {
        case -1:
            /* Error. */
            mysyslog(LOG_ERR, _("unable to fork: %m"));
index 7e531258052e930ec61e61ea39b5852ce0e409eb..8175b6efc09eb581976829386502638acb09570b 100644 (file)
@@ -751,7 +751,7 @@ run_command(char *path, char **argv)
     pid_t pid, rv;
     debug_decl(run_command, SUDO_DEBUG_UTIL)
 
-    switch (pid = fork()) {
+    switch (pid = sudo_debug_fork()) {
        case -1:
            error(1, _("unable to execute %s"), path);
            break;      /* NOTREACHED */
index 36175e2a634bf689e7e919e0efa673bce4129645..2851760095b36344548a9f1838e256c9de0c0bac 100644 (file)
@@ -99,7 +99,7 @@ static int fork_cmnd(struct command_details *details, int sv[2])
     sa.sa_handler = handler;
     sigaction(SIGCONT, &sa, NULL);
 
-    child = fork();
+    child = sudo_debug_fork();
     switch (child) {
     case -1:
        error(1, _("unable to fork"));
@@ -214,7 +214,7 @@ sudo_execute(struct command_details *details, struct command_status *cstat)
 
     /* If running in background mode, fork and exit. */
     if (ISSET(details->flags, CD_BACKGROUND)) {
-       switch (fork()) {
+       switch (sudo_debug_fork()) {
            case -1:
                cstat->type = CMD_ERRNO;
                cstat->val = errno;
index 5ce320824390195d129ee47ef79db60eea603884..dd14f8ad58da0182f42052745bd625e56014b660 100644 (file)
@@ -618,7 +618,7 @@ fork_pty(struct command_details *details, int sv[], int *maxfd)
        }
     }
 
-    child = fork();
+    child = sudo_debug_fork();
     switch (child) {
     case -1:
        error(1, _("unable to fork"));
@@ -953,7 +953,7 @@ exec_monitor(struct command_details *details, int backchannel)
     /* Start command and wait for it to stop or exit */
     if (pipe(errpipe) == -1)
        error(1, _("unable to create pipe"));
-    child = fork();
+    child = sudo_debug_fork();
     if (child == -1) {
        warning(_("unable to fork"));
        goto bad;