Software /
code /
prosody
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"); |