aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2021-11-30 18:19:40 +0100
committerKim Alvefur <zash@zash.se>2021-11-30 18:19:40 +0100
commit61348c0a7dba3522ee0a8f24467fb64538b1ec97 (patch)
treea21731318f57de3ae849de00aac398af9956ec2f /net
parent0bb07b9711102edc0ff7eb9ddfe5014f2d7b8594 (diff)
downloadprosody-61348c0a7dba3522ee0a8f24467fb64538b1ec97.tar.gz
prosody-61348c0a7dba3522ee0a8f24467fb64538b1ec97.zip
net.server_epoll: Prevent loop attempting to send last data after close
If the connection is closed by the peer, any buffered data is given a last chance to be sent (see f27b9319e0da). If the connection is Really closed, no attempt to write will occur, instead epoll will raise the error flag and :onreadable() will be invoked again, where it will try to :close() again for the same reason, thus looping until the connection somehow gets destroyed. By clearing the _connected flag, the second time it passes :onreadable() it should go directly to :destroy(), breaking the loop. Thanks Link Mauve for reporting
Diffstat (limited to 'net')
-rw-r--r--net/server_epoll.lua1
1 files changed, 1 insertions, 0 deletions
diff --git a/net/server_epoll.lua b/net/server_epoll.lua
index 4852d7c0..62fe3675 100644
--- a/net/server_epoll.lua
+++ b/net/server_epoll.lua
@@ -577,6 +577,7 @@ interface.send = interface.write;
-- Close, possibly after writing is done
function interface:close()
if self._connected and self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
+ self._connected = false;
self:set(false, true); -- Flush final buffer contents
self:setreadtimeout(false);
self:setwritetimeout();