Changeset

11972:520ce76440ad

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
author Kim Alvefur <zash@zash.se>
date Tue, 30 Nov 2021 18:19:40 +0100
parents 11971:0b350909da24
children 11973:d4730ae60226
files net/server_epoll.lua
diffstat 1 files changed, 1 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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();