# HG changeset patch # User Kim Alvefur # Date 1638292780 -3600 # Node ID 520ce76440adab911551a87d4680b25ccb776eb2 # Parent 0b350909da243e7f57f18e2606ab0046b6bc1c9e 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 diff -r 0b350909da24 -r 520ce76440ad net/server_epoll.lua --- a/net/server_epoll.lua Tue Nov 30 16:26:01 2021 +0100 +++ b/net/server_epoll.lua Tue Nov 30 18:19:40 2021 +0100 @@ -577,6 +577,7 @@ -- 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();