Comparison

net/server_epoll.lua @ 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
parent 11922:28f5c8061dad
child 12011:9dc36fdbdba1
comparison
equal deleted inserted replaced
11971:0b350909da24 11972:520ce76440ad
575 interface.send = interface.write; 575 interface.send = interface.write;
576 576
577 -- Close, possibly after writing is done 577 -- Close, possibly after writing is done
578 function interface:close() 578 function interface:close()
579 if self._connected and self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then 579 if self._connected and self.writebuffer and (self.writebuffer[1] or type(self.writebuffer) == "string") then
580 self._connected = false;
580 self:set(false, true); -- Flush final buffer contents 581 self:set(false, true); -- Flush final buffer contents
581 self:setreadtimeout(false); 582 self:setreadtimeout(false);
582 self:setwritetimeout(); 583 self:setwritetimeout();
583 self.write, self.send = noop, noop; -- No more writing 584 self.write, self.send = noop, noop; -- No more writing
584 self:debug("Close after writing remaining buffered data"); 585 self:debug("Close after writing remaining buffered data");