WebProcess crashes during startup if libdispatch is initialized by WebProcessShim...
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Aug 2011 16:22:29 +0000 (16:22 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 19 Aug 2011 16:22:29 +0000 (16:22 +0000)
https://bugs.webkit.org/show_bug.cgi?id=66508
<rdar://problem/9828476>

Reviewed by Mark Rowe.

* mac/MainMac.cpp:
(closeUnusedFileDescriptors):
Check if a file descriptor is a kqueue and don't close it if that is the case. While this
isn't a complete fix, (it won't work if other initializers end up creating non-kqueue file descriptors)
it's good enough for Snow Leopard. For Lion, we should use the new posix_spawn API that lets you whitelist
file descriptors from the parent process.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@93420 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/mac/MainMac.cpp

index 835c2ae293d4ec7434f5a01fb81e416f6d1488f8..c1cc9784673609cb8dd8ee425cfddc8ddea5ade8 100644 (file)
@@ -1,3 +1,18 @@
+2011-08-18  Anders Carlsson  <andersca@apple.com>
+
+        WebProcess crashes during startup if libdispatch is initialized by WebProcessShim.dylib
+        https://bugs.webkit.org/show_bug.cgi?id=66508
+        <rdar://problem/9828476>
+
+        Reviewed by Mark Rowe.
+
+        * mac/MainMac.cpp:
+        (closeUnusedFileDescriptors):
+        Check if a file descriptor is a kqueue and don't close it if that is the case. While this
+        isn't a complete fix, (it won't work if other initializers end up creating non-kqueue file descriptors)
+        it's good enough for Snow Leopard. For Lion, we should use the new posix_spawn API that lets you whitelist
+        file descriptors from the parent process.
+
 2011-08-19  Benjamin Poulain  <benjamin@webkit.org>
 
         [Qt][WK2] Add a basic engine to control the content of the viewport
index 5e6e6a280316c9e4a28619a44f0f8741edc91538..5afc1ef245f865114ef95877143d724437a9201f 100644 (file)
@@ -24,8 +24,9 @@
  */
 
 #include <dlfcn.h>
-#include <stdlib.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <sys/event.h>
 #include <unistd.h>
 
 static void closeUnusedFileDescriptors()
@@ -33,8 +34,15 @@ static void closeUnusedFileDescriptors()
     int numFDs = getdtablesize();
 
     // Close all file descriptors except stdin, stdout and stderr.
-    for (int fd = 3; fd < numFDs; ++fd)
+    for (int fd = 3; fd < numFDs; ++fd) {
+        // Check if this is a kqueue file descriptor. If it is, we don't want to close it because it has
+        // been created by initializing libdispatch from a global initializer. See <rdar://problem/9828476> for more details.
+        struct timespec timeSpec = { 0, 0 };
+        if (!kevent(fd, 0, 0, 0, 0, &timeSpec))
+            continue;
+
         close(fd);
+    }
 }
 
 int main(int argc, char** argv)