From: Ben Pfaff Date: Thu, 31 Mar 2011 16:36:10 +0000 (-0700) Subject: daemon: Tolerate EINTR in fork_and_wait_for_startup(). X-Git-Tag: v1.1.1~39 X-Git-Url: http://git.onelab.eu/?p=sliver-openvswitch.git;a=commitdiff_plain;h=8fb32694154c620dce9ff0379a744178f73c1c89 daemon: Tolerate EINTR in fork_and_wait_for_startup(). It seems possible that a signal coming in at the wrong time could confuse this code. It's always best to loop on EINTR. --- diff --git a/lib/daemon.c b/lib/daemon.c index 64e2f9e9a..173dabe6f 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 4e54e697f..4df237159 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