From 18c1d6063d7e7db446af50fcf46ec60ee75c7024 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Sat, 13 Jun 2026 19:16:10 +0800 Subject: [PATCH] fix(dialer/ssh): evict dead session when OpenChannel fails (issue #792) --- dialer/ssh/dialer.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dialer/ssh/dialer.go b/dialer/ssh/dialer.go index 8c8317ae..ee095ee2 100644 --- a/dialer/ssh/dialer.go +++ b/dialer/ssh/dialer.go @@ -105,6 +105,13 @@ func (d *sshDialer) Dial(ctx context.Context, addr string, opts ...dialer.DialOp } channel, reqs, err := session.OpenChannel(ssh_util.GostSSHTunnelRequest) if err != nil { + // The cached session is unusable (typically dead but not yet detected + // by IsClosed, e.g. an idle connection silently dropped by NAT). Tear + // it down and evict it so the next Dial rebuilds a fresh session + // instead of retrying against this dead one. Matches the eviction + // pattern in the kcp/quic/icmp dialers. + session.Close() + delete(d.sessions, addr) return nil, err } go ssh.DiscardRequests(reqs)