core.s2smanager: Don't remove unrelated session on close of bidi session 0.12
authorKim Alvefur <zash@zash.se>
Mon, 27 Jun 2022 01:22:36 +0200
branch0.12
changeset 12590 4c8941b5b05e
parent 12588 fb0bf0a0864f
child 12592 b15d3cf98ba6
child 12596 d580e6a57cbb
core.s2smanager: Don't remove unrelated session on close of bidi session Normally with bidi, any outgoing connection should be the same as the incoming, hence when closing a bidi connection it should be removed as a route to the remote server. However it is not guaranteed, a remote bidi-capable server might have decided to open a new connection for some reason. This can lead to a situation where there are two bidi connections, and the s2sout route is a locally initiated s2sout connection. In this case, such a s2sout connection should be kept. Noticed in a rare case where bidi has just been enabled on a running server, and something establishes new connections immediately when a connection is closed.
core/s2smanager.lua
--- a/core/s2smanager.lua	Mon May 30 17:34:58 2022 +0200
+++ b/core/s2smanager.lua	Mon Jun 27 01:22:36 2022 +0200
@@ -94,7 +94,7 @@
 		hosts[session.from_host].s2sout[session.to_host] = nil;
 		session:bounce_sendq(bounce_reason or reason);
 	elseif session.direction == "incoming" then
-		if session.outgoing then
+		if session.outgoing and hosts[session.to_host].s2sout[session.from_host] == session then
 			hosts[session.to_host].s2sout[session.from_host] = nil;
 		end
 		incoming_s2s[session] = nil;