[ovs-dev] [branch-1.1 05/34] daemon: Tolerate EINTR in fork_and_wait_for_startup().

Ben Pfaff blp at nicira.com
Fri Apr 29 21:56:36 UTC 2011


It seems possible that a signal coming in at the wrong time could confuse
this code.  It's always best to loop on EINTR.
---
 lib/daemon.c         |    3 ++-
 python/ovs/daemon.py |   13 +++++++++----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/lib/daemon.c b/lib/daemon.c
index 64e2f9e..173dabe 100644
--- a/lib/daemon.c
+++ b/lib/daemon.c
@@ -244,11 +244,12 @@ fork_and_wait_for_startup(int *fdp)
     pid = fork();
     if (pid > 0) {
         /* Running in parent process. */
+        size_t bytes_read;
         char c;
 
         close(fds[1]);
         fatal_signal_fork();
-        if (read(fds[0], &c, 1) != 1) {
+        if (read_fully(fds[0], &c, 1, &bytes_read) != 0) {
             int retval;
             int status;
 
diff --git a/python/ovs/daemon.py b/python/ovs/daemon.py
index 4e54e69..4df2371 100644
--- a/python/ovs/daemon.py
+++ b/python/ovs/daemon.py
@@ -213,10 +213,15 @@ def _fork_and_wait_for_startup():
         # Running in parent process.
         os.close(wfd)
         ovs.fatal_signal.fork()
-        try:
-            s = os.read(rfd, 1)
-        except OSError, e:
-            s = ""
+        while True:
+            try:
+                s = os.read(rfd, 1)
+                error = 0
+            except OSError, e:
+                s = ""
+                error = e.errno
+            if error != errno.EINTR:
+                break
         if len(s) != 1:
             retval, status = _waitpid(pid, 0)
             if (retval == pid and
-- 
1.7.4.4




More information about the dev mailing list