From 41bc47b1ecde0e0eb1db7f0d5afe21d37dcd9033 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 27 Apr 2026 13:36:11 +0000 Subject: [PATCH] Handle browser dialer cleanup errors on instance lifecycle Agent-Logs-Url: https://github.com/XTLS/Xray-core/sessions/b8c640ab-f93c-4609-8e34-a8e14e2be9e7 Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com> --- core/xray.go | 4 +++- transport/internet/browser_dialer/manager.go | 12 ++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/xray.go b/core/xray.go index 1fb3bbab..5a13ecdf 100644 --- a/core/xray.go +++ b/core/xray.go @@ -396,7 +396,9 @@ func (s *Instance) Start() error { for _, f := range s.features { if err := f.Start(); err != nil { s.running = false - _ = browser_dialer.StopCollectedDialerProxyURLs() + if stopErr := browser_dialer.StopCollectedDialerProxyURLs(); stopErr != nil { + return errors.New("failed to clean up browser dialer after startup failure").Base(errors.New(serial.Concat(err, "; ", stopErr))) + } return err } } diff --git a/transport/internet/browser_dialer/manager.go b/transport/internet/browser_dialer/manager.go index 9ecd89ae..1e47be3e 100644 --- a/transport/internet/browser_dialer/manager.go +++ b/transport/internet/browser_dialer/manager.go @@ -14,6 +14,7 @@ import ( "github.com/gorilla/websocket" "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/platform" + "github.com/xtls/xray-core/common/serial" "github.com/xtls/xray-core/common/uuid" ) @@ -124,17 +125,20 @@ func StartCollectedDialerProxyURLs() error { } func StopCollectedDialerProxyURLs() error { - var stopErr error + var stopErrs []string for listenAddr, server := range serversByListenAddr { - if err := server.stop(); err != nil && stopErr == nil { - stopErr = errors.New("failed to stop browser dialer listener on ", listenAddr).Base(err) + if err := server.stop(); err != nil { + stopErrs = append(stopErrs, serial.Concat("failed to stop browser dialer listener on ", listenAddr, ": ", err)) } } dialersByAddress = map[string]*dialerInstance{} serversByListenAddr = map[string]*dialerServer{} pendingURLs = nil initialized = false - return stopErr + if len(stopErrs) > 0 { + return errors.New(strings.Join(stopErrs, "; ")) + } + return nil } type dialerInstance struct {