Error sending IPC message: Broken pipe
authorcturner@igalia.com <cturner@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 23 May 2020 16:21:11 +0000 (16:21 +0000)
committercturner@igalia.com <cturner@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 23 May 2020 16:21:11 +0000 (16:21 +0000)
https://bugs.webkit.org/show_bug.cgi?id=206052

Reviewed by Adrian Perez de Castro.

The Connection implementation on *nix was not handling socket
shutdowns gracefully, this was leading to many IPC error messages
being printed. It looks like the "errors" were actually
application issues, trying to send messages during socket shutdown
sequences, rather than more serious message drop problems.

Unclear how to autotest this, but manual testing opening lots of tabs
definitely hits these codepaths.

* Platform/IPC/unix/ConnectionUnix.cpp:
(IPC::Connection::readyReadHandler): Handle ECONNRESET by cleanly
closing the connection.
(IPC::Connection::sendOutputMessage): Ditto, also handle the
wrinkle that for "reasons", Linux can return EPIPE when it means
ECONNRESET.

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

Source/WebKit/ChangeLog
Source/WebKit/Platform/IPC/unix/ConnectionUnix.cpp

index e6056bf..07c1f3f 100644 (file)
@@ -1,3 +1,26 @@
+2020-05-23  Charlie Turner  <cturner@igalia.com>
+
+        Error sending IPC message: Broken pipe
+        https://bugs.webkit.org/show_bug.cgi?id=206052
+
+        Reviewed by Adrian Perez de Castro.
+
+        The Connection implementation on *nix was not handling socket
+        shutdowns gracefully, this was leading to many IPC error messages
+        being printed. It looks like the "errors" were actually
+        application issues, trying to send messages during socket shutdown
+        sequences, rather than more serious message drop problems.
+
+        Unclear how to autotest this, but manual testing opening lots of tabs
+        definitely hits these codepaths.
+
+        * Platform/IPC/unix/ConnectionUnix.cpp:
+        (IPC::Connection::readyReadHandler): Handle ECONNRESET by cleanly
+        closing the connection.
+        (IPC::Connection::sendOutputMessage): Ditto, also handle the
+        wrinkle that for "reasons", Linux can return EPIPE when it means
+        ECONNRESET.
+
 2020-05-22  James Savage  <james.savage@apple.com>
 
         Create Swift overlay for WebKit framework
index f3dc5ef..3d54402 100644 (file)
@@ -322,6 +322,11 @@ void Connection::readyReadHandler()
             if (errno == EAGAIN || errno == EWOULDBLOCK)
                 return;
 
+            if (errno == ECONNRESET) {
+                connectionDidClose();
+                return;
+            }
+
             if (m_isConnected) {
                 WTFLogAlways("Error receiving IPC message on socket %d in process %d: %s", m_socketDescriptor, getpid(), strerror(errno));
                 connectionDidClose();
@@ -544,6 +549,17 @@ bool Connection::sendOutputMessage(UnixMessage& outputMessage)
 #endif
         }
 
+#if OS(LINUX)
+        // Linux can return EPIPE instead of ECONNRESET
+        if (errno == EPIPE || errno == ECONNRESET)
+#else
+        if (errno == ECONNRESET)
+#endif
+        {
+            connectionDidClose();
+            return false;
+        }
+
         if (m_isConnected)
             WTFLogAlways("Error sending IPC message: %s", strerror(errno));
         return false;