X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/17a1ebd101f0653e69736416a2a28d0ada423141..bb86baea10afec3a7e4860c17b20edd485c628d6:/src/unix/gsocket.cpp diff --git a/src/unix/gsocket.cpp b/src/unix/gsocket.cpp index 550b3d51b3..eaa732bb78 100644 --- a/src/unix/gsocket.cpp +++ b/src/unix/gsocket.cpp @@ -328,6 +328,9 @@ void GSocket::Shutdown() assert(this); + /* Don't allow events to fire after socket has been closed */ + gs_gui_functions->Disable_Events(this); + /* If socket has been created, shutdown it */ if (m_fd != INVALID_SOCKET) { @@ -879,7 +882,13 @@ int GSocket::Read(char *buffer, int size) else ret = Recv_Dgram(buffer, size); - if (ret == -1) { + /* If recv returned zero, then the connection is lost, and errno is not set. + * Otherwise, recv has returned an error (-1), in which case we have lost the + * socket only if errno does _not_ indicate that there may be more data to read. + */ + if (ret == 0) + m_error = GSOCK_IOERR; + else if (ret == -1) { if ((errno == EWOULDBLOCK) || (errno == EAGAIN)) m_error = GSOCK_WOULDBLOCK; else @@ -1023,7 +1032,12 @@ GSocketEventFlags GSocket::Select(GSocketEventFlags flags) result |= GSOCK_CONNECTION_FLAG; m_detected |= GSOCK_CONNECTION_FLAG; } - else if ((errno != EWOULDBLOCK) && (errno != EAGAIN) && (errno != EINTR)) + /* If recv returned zero, then the connection is lost, and errno is not set. + * Otherwise, recv has returned an error (-1), in which case we have lost the + * socket only if errno does _not_ indicate that there may be more data to read. + */ + else if (num == 0 || + (errno != EWOULDBLOCK) && (errno != EAGAIN) && (errno != EINTR)) { m_detected = GSOCK_LOST_FLAG; m_establishing = false;