Diff

util/adminstream.lua @ 13794:471b676e64eb 13.0

util.adminstream: Fix traceback on double-close (fixes #1913) In some circumstances, particularly with 'opportunistic_writes' and 'fatal_errors' enabled in the epoll backend, the connection may be closed halfway through the session close process (because it contains debug logging, which in the case of the watch:log() command, will trigger a write to the socket). The chosen fix is to cache session.conn in a local variable (we already did this later on, but this pulls it up to the top of the function, which is generally more correct anyway).
author Matthew Wild <mwild1@gmail.com>
date Mon, 31 Mar 2025 16:25:09 +0100
parent 13589:b1b931d5fee8
line wrap: on
line diff
--- a/util/adminstream.lua	Sat Mar 29 22:25:19 2025 +0100
+++ b/util/adminstream.lua	Mon Mar 31 16:25:09 2025 +0100
@@ -82,7 +82,8 @@
 
 local function session_close(session, reason)
 	local log = session.log or log;
-	if session.conn then
+	local conn = session.conn;
+	if conn then
 		if session.notopen then
 			session:open_stream();
 		end
@@ -115,7 +116,6 @@
 		session.log("debug", "c2s stream for %s closed: %s", session.full_jid or session.ip or "<unknown>", reason_text or "session closed");
 
 		-- Authenticated incoming stream may still be sending us stanzas, so wait for </stream:stream> from remote
-		local conn = session.conn;
 		if reason_text == nil and not session.notopen and session.type == "c2s" then
 			-- Grace time to process data from authenticated cleanly-closed stream
 			add_task(stream_close_timeout, function ()