diff --git a/Libraries/LibCore/CLocalSocket.cpp b/Libraries/LibCore/CLocalSocket.cpp index b7156b6119..6a9b195095 100644 --- a/Libraries/LibCore/CLocalSocket.cpp +++ b/Libraries/LibCore/CLocalSocket.cpp @@ -5,6 +5,8 @@ CLocalSocket::CLocalSocket(int fd, CObject* parent) : CSocket(CSocket::Type::Local, parent) { + // NOTE: This constructor is used by CLocalServer::accept(), so the socket is already connected. + m_connected = true; set_fd(fd); set_mode(CIODevice::ReadWrite); set_error(0); diff --git a/Libraries/LibCore/CSocket.cpp b/Libraries/LibCore/CSocket.cpp index 8f7cc6067e..7ac939e780 100644 --- a/Libraries/LibCore/CSocket.cpp +++ b/Libraries/LibCore/CSocket.cpp @@ -89,6 +89,7 @@ bool CSocket::common_connect(const struct sockaddr* addr, socklen_t addrlen) m_notifier->on_ready_to_write = [this] { dbg() << *this << " connected!"; m_connected = true; + ensure_read_notifier(); m_notifier->set_event_mask(CNotifier::Event::None); if (on_connected) on_connected(); @@ -100,6 +101,7 @@ bool CSocket::common_connect(const struct sockaddr* addr, socklen_t addrlen) } dbg() << *this << " connected ok!"; m_connected = true; + ensure_read_notifier(); if (on_connected) on_connected(); return true; @@ -132,7 +134,18 @@ void CSocket::did_update_fd(int fd) m_read_notifier = nullptr; return; } - m_read_notifier = CNotifier::construct(fd, CNotifier::Event::Read, this); + if (m_connected) { + ensure_read_notifier(); + } else { + // I don't think it would be right if we updated the fd while not connected *but* while having a notifier.. + ASSERT(!m_read_notifier); + } +} + +void CSocket::ensure_read_notifier() +{ + ASSERT(m_connected); + m_read_notifier = CNotifier::construct(fd(), CNotifier::Event::Read, this); m_read_notifier->on_ready_to_read = [this] { if (on_ready_to_read) on_ready_to_read(); diff --git a/Libraries/LibCore/CSocket.h b/Libraries/LibCore/CSocket.h index 563c7b5586..6e276b17d2 100644 --- a/Libraries/LibCore/CSocket.h +++ b/Libraries/LibCore/CSocket.h @@ -51,6 +51,7 @@ protected: private: virtual bool open(CIODevice::OpenMode) override { ASSERT_NOT_REACHED(); } bool common_connect(const struct sockaddr*, socklen_t); + void ensure_read_notifier(); Type m_type { Type::Invalid }; RefPtr m_notifier; diff --git a/Libraries/LibCore/CTCPSocket.cpp b/Libraries/LibCore/CTCPSocket.cpp index 060b76cd6b..d6ecdfd89d 100644 --- a/Libraries/LibCore/CTCPSocket.cpp +++ b/Libraries/LibCore/CTCPSocket.cpp @@ -5,6 +5,8 @@ CTCPSocket::CTCPSocket(int fd, CObject* parent) : CSocket(CSocket::Type::TCP, parent) { + // NOTE: This constructor is used by CTCPServer::accept(), so the socket is already connected. + m_connected = true; set_fd(fd); set_mode(CIODevice::ReadWrite); set_error(0);