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 {