base: Fix a potential race in PollQueue::setupAsyncIO
authorAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 7 Oct 2013 14:03:15 +0000 (16:03 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 7 Oct 2013 14:03:15 +0000 (16:03 +0200)
There is a potential race between enabling asynchronous IO and
selecting the target for the SIGIO signal. This changeset move the
F_SETOWN call to before the F_SETFL call that enables SIGIO
delivery. This ensures that signals are always sent to the correct
process.

src/base/pollevent.cc

index 67708c1295cec9b2d464f23aab40dc7e62124224..cb44d8728162de3d008403e353081c1db1b7bca3 100644 (file)
@@ -213,13 +213,13 @@ PollQueue::setupAsyncIO(int fd, bool set)
     else
         flags &= ~(FASYNC);
 
-    if (fcntl(fd, F_SETFL, flags) == -1)
-        panic("Could not set up async IO");
-
     if (set) {
       if (fcntl(fd, F_SETOWN, getpid()) == -1)
         panic("Could not set up async IO");
     }
+
+    if (fcntl(fd, F_SETFL, flags) == -1)
+        panic("Could not set up async IO");
 }
 
 void