]> granicus.if.org Git - sudo/commitdiff
It is possible for WIFSTOPPED to be true even if waitpid() is not
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 2 Oct 2015 17:24:01 +0000 (11:24 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 2 Oct 2015 17:24:01 +0000 (11:24 -0600)
given WUNTRACED if the child is ptraced.  Don't exit the waitpid()
loop if WIFSTOPPED is true, just in case.

plugins/sudoers/logging.c
plugins/sudoers/visudo.c
src/tgetpass.c

index 19902ae10739e134e018f746f253392d10c7c2de..cbb18ce00504f37f7e22d68ad53f00e6b356c87b 100644 (file)
@@ -591,9 +591,13 @@ send_mail(const char *fmt, ...)
            break;
        default:
            /* Parent. */
-           do {
+           for (;;) {
                rv = waitpid(pid, &status, 0);
-           } while (rv == -1 && errno == EINTR);
+               if (rv == -1 && errno != EINTR)
+                   break;
+               if (rv != -1 && !WIFSTOPPED(status))
+                   break;
+           }
            return true; /* not debug */
     }
 
@@ -732,9 +736,13 @@ send_mail(const char *fmt, ...)
     fputs("\n\n", mail);
 
     fclose(mail);
-    do {
-        rv = waitpid(pid, &status, 0);
-    } while (rv == -1 && errno == EINTR);
+    for (;;) {
+       rv = waitpid(pid, &status, 0);
+       if (rv == -1 && errno != EINTR)
+           break;
+       if (rv != -1 && !WIFSTOPPED(status))
+           break;
+    }
     sudo_debug_exit(__func__, __FILE__, __LINE__, sudo_debug_subsys);
     _exit(0);
 }
index 155de7c1c55e000c11c1950effb629b32bb8c77c..62e8a5a983bce8c265d14f76ce18aaaef53bd30b 100644 (file)
@@ -849,9 +849,13 @@ run_command(char *path, char **argv)
            break;      /* NOTREACHED */
     }
 
-    do {
+    for (;;) {
        rv = waitpid(pid, &status, 0);
-    } while (rv == -1 && errno == EINTR);
+       if (rv == -1 && errno != EINTR)
+           break;
+       if (rv != -1 && !WIFSTOPPED(status))
+           break;
+    }
 
     if (rv != -1)
        rv = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
index 3811fd58743313d1916d3aee6bb121c8177017bb..47291bc1f1ff8c403c73f673be2bbbfc947deebe 100644 (file)
@@ -300,8 +300,13 @@ sudo_askpass(const char *askpass, const char *prompt)
     (void) sigaction(SIGPIPE, &saved_sa_pipe, NULL);
 
     /* Wait for child to exit. */
-    while (waitpid(child, &status, 0) == -1 && errno == EINTR)
-       continue;
+    for (;;) {
+       pid_t rv = waitpid(child, &status, 0);
+       if (rv == -1 && errno != EINTR)
+           break;
+       if (rv != -1 && !WIFSTOPPED(status))
+           break;
+    }
 
     if (pass == NULL)
        errno = EINTR;  /* make cancel button simulate ^C */