]> granicus.if.org Git - sudo/commitdiff
Handle EINTR from write(2) when writing to pipes and socket pairs.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 27 May 2014 16:16:49 +0000 (10:16 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 27 May 2014 16:16:49 +0000 (10:16 -0600)
src/exec.c
src/exec_pty.c
src/signal.c

index d63de548ad8d4e9aa341f864b15b832b5a5fb347..fcf353d408e24b3389e2c7161221431c2a201444 100644 (file)
@@ -877,7 +877,10 @@ handler(int s, siginfo_t *info, void *context)
      * The pipe is non-blocking, if we overflow the kernel's pipe
      * buffer we drop the signal.  This is not a problem in practice.
      */
-    ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
+    while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
+       if (errno != EINTR)
+           break;
+    }
 }
 #else
 void
@@ -889,7 +892,10 @@ handler(int s)
      * The pipe is non-blocking, if we overflow the kernel's pipe
      * buffer we drop the signal.  This is not a problem in practice.
      */
-    ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
+    while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
+       if (errno != EINTR)
+           break;
+    }
 }
 #endif
 
@@ -911,7 +917,10 @@ handler_user_only(int s, siginfo_t *info, void *context)
         * The pipe is non-blocking, if we overflow the kernel's pipe
         * buffer we drop the signal.  This is not a problem in practice.
         */
-       ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
+       while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
+           if (errno != EINTR)
+               break;
+       }
     }
 }
 #endif /* SA_SIGINFO */
index ba3a9b22d427de900af2e84ade3a5dc98d5c5ab9..77ed418ecb8650c171bc75d93829896dc122e987 100644 (file)
@@ -148,7 +148,10 @@ mon_handler(int s, siginfo_t *info, void *context)
      * The pipe is non-blocking, if we overflow the kernel's pipe
      * buffer we drop the signal.  This is not a problem in practice.
      */
-    ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
+    while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
+       if (errno != EINTR)
+           break;
+    }
 }
 #else
 static void
@@ -160,7 +163,10 @@ mon_handler(int s)
      * The pipe is non-blocking, if we overflow the kernel's pipe
      * buffer we drop the signal.  This is not a problem in practice.
      */
-    ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
+    while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
+       if (errno != EINTR)
+           break;
+    }
 }
 #endif
 
@@ -1281,7 +1287,10 @@ exec_monitor(struct command_details *details, int backchannel)
 
        /* setup tty and exec command */
        exec_pty(details, &cstat, errpipe[1]);
-       ignore_result(write(errpipe[1], &cstat, sizeof(cstat)));
+       while (write(errpipe[1], &cstat, sizeof(cstat)) == -1) {
+           if (errno != EINTR)
+               break;
+       }
        _exit(1);
     }
     close(errpipe[1]);
index 6ae41f597ee35793ea88f48ec926b293a497d637..54377ea9cfdb5e476236ec38e66395bf03ff332a 100644 (file)
@@ -102,7 +102,10 @@ sudo_handler(int signo)
      * The pipe is non-blocking, if we overflow the kernel's pipe
      * buffer we drop the signal.  This is not a problem in practice.
      */
-    ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
+    while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
+       if (errno != EINTR)
+           break;
+    }
 }
 
 /*