Explorar el Código

LocalSocket: Fix mismatch between can_write() and write() logic.

can_write() was saying yes in situations where write() would overflow the
internal buffer. This patch adds a has_attached_peer() helper to make it
easier to understand what's going on in these functions.
Andreas Kling hace 6 años
padre
commit
85d2e85912
Se han modificado 2 ficheros con 18 adiciones y 12 borrados
  1. 17 12
      Kernel/Net/LocalSocket.cpp
  2. 1 0
      Kernel/Net/LocalSocket.h

+ 17 - 12
Kernel/Net/LocalSocket.cpp

@@ -144,9 +144,9 @@ bool LocalSocket::can_read(FileDescriptor& descriptor) const
     if (role == SocketRole::Listener)
         return can_accept();
     if (role == SocketRole::Accepted)
-        return (!m_connected_fds_open && !m_connecting_fds_open) || !m_for_server.is_empty();
+        return !has_attached_peer(descriptor) || !m_for_server.is_empty();
     if (role == SocketRole::Connected)
-        return !m_accepted_fds_open || !m_for_client.is_empty();
+        return !has_attached_peer(descriptor) || !m_for_client.is_empty();
     ASSERT_NOT_REACHED();
 }
 
@@ -170,27 +170,32 @@ ssize_t LocalSocket::read(FileDescriptor& descriptor, byte* buffer, ssize_t size
     ASSERT_NOT_REACHED();
 }
 
+bool LocalSocket::has_attached_peer(const FileDescriptor& descriptor) const
+{
+    if (descriptor.socket_role() == SocketRole::Accepted)
+        return m_connected_fds_open || m_connecting_fds_open;
+    if (descriptor.socket_role() == SocketRole::Connected)
+        return m_accepted_fds_open;
+    ASSERT_NOT_REACHED();
+}
+
 ssize_t LocalSocket::write(FileDescriptor& descriptor, const byte* data, ssize_t size)
 {
-    if (descriptor.socket_role() == SocketRole::Accepted) {
-        if (!m_accepted_fds_open)
-            return -EPIPE;
+    if (!has_attached_peer(descriptor))
+        return -EPIPE;
+    if (descriptor.socket_role() == SocketRole::Accepted)
         return m_for_client.write(data, size);
-    }
-    if (descriptor.socket_role() == SocketRole::Connected) {
-        if (!m_connected_fds_open && !m_connecting_fds_open)
-            return -EPIPE;
+    if (descriptor.socket_role() == SocketRole::Connected)
         return m_for_server.write(data, size);
-    }
     ASSERT_NOT_REACHED();
 }
 
 bool LocalSocket::can_write(FileDescriptor& descriptor) const
 {
     if (descriptor.socket_role() == SocketRole::Accepted)
-        return (!m_connected_fds_open && !m_connecting_fds_open) || m_for_client.bytes_in_write_buffer() < 4096;
+        return !has_attached_peer(descriptor) || m_for_client.bytes_in_write_buffer() < 4096;
     if (descriptor.socket_role() == SocketRole::Connected)
-        return !m_accepted_fds_open || m_for_server.bytes_in_write_buffer() < 4096;
+        return !has_attached_peer(descriptor) || m_for_server.bytes_in_write_buffer() < 4096;
     ASSERT_NOT_REACHED();
 }
 

+ 1 - 0
Kernel/Net/LocalSocket.h

@@ -25,6 +25,7 @@ public:
 private:
     explicit LocalSocket(int type);
     virtual bool is_local() const override { return true; }
+    bool has_attached_peer(const FileDescriptor&) const;
 
     RetainPtr<FileDescriptor> m_file;