From 25eeda1872e4b0eee594c2c31d3b40eb04335287 Mon Sep 17 00:00:00 2001 From: mmorrison Date: Tue, 7 Apr 2020 16:13:13 -0600 Subject: [PATCH] Fix socket not getting registered for epoll events When epoll is enabled in the PhysicalSocketServer, a socket may not get registered for its epoll events. If an AsyncSocket is closed and re-created during one of its signal callbacks, its old epoll events and new epolls events bitmasks may be the same, even though the fd has changed. This causes the epoll implementation to not register the new fd for any events. Fix this by resetting the saved events bitmask when the socket is closed. This ensures the new fd, if any, is registered if needed. Bug: webrtc:11497 Change-Id: Idea499e09aefdf292430d1a774a046f963603b95 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/173103 Reviewed-by: Taylor Reviewed-by: Karl Wiberg Commit-Queue: Karl Wiberg Cr-Commit-Position: refs/heads/master@{#31039} --- rtc_base/physical_socket_server.cc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rtc_base/physical_socket_server.cc b/rtc_base/physical_socket_server.cc index 0cbcb8130c..ed4d42ca74 100644 --- a/rtc_base/physical_socket_server.cc +++ b/rtc_base/physical_socket_server.cc @@ -893,6 +893,14 @@ int SocketDispatcher::Close() { #if defined(WEBRTC_WIN) id_ = 0; signal_close_ = false; +#endif +#if defined(WEBRTC_USE_EPOLL) + // If we're batching events, the socket can be closed and reopened + // during the batch. Set saved_enabled_events_ to 0 here so the new + // socket, if any, has the correct old events bitfield + if (saved_enabled_events_ != -1) { + saved_enabled_events_ = 0; + } #endif ss_->Remove(this); return PhysicalSocket::Close();