From 91920aa8055ec7cd85945003f388a8d83abd33c7 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Wed, 3 Jun 2026 20:17:20 +0800 Subject: [PATCH] fix #866: SOCKS5 nil ptr TLSConfig in selector Move SetDefaultTLSConfig before register(cfg) in loader.go so ParseService can access it when building handlers. Also add a defensive nil check in socks5 serverSelector.Select() for MethodTLS to prevent future ordering regressions. Root cause: in selector.go, Select() tried to read ClientHello via TLSConfig.GetConfigForClient but s.TLSConfig was nil because register(cfg) -> ParseService -> handler Init ran before SetDefaultTLSConfig was called from loader.go. --- config/loader/loader.go | 4 ++-- handler/socks/v5/selector.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/loader/loader.go b/config/loader/loader.go index dff051a2..0b4d93fa 100644 --- a/config/loader/loader.go +++ b/config/loader/loader.go @@ -78,12 +78,12 @@ func (l *loader) Load(cfg *config.Config) error { } logger.SetDefault(logger_parser.ParseLogger(&config.LoggerConfig{Log: logCfg})) + parsing.SetDefaultTLSConfig(tlsCfg) + if err := register(cfg); err != nil { return err } - parsing.SetDefaultTLSConfig(tlsCfg) - return nil } diff --git a/handler/socks/v5/selector.go b/handler/socks/v5/selector.go index 683396b2..700416df 100644 --- a/handler/socks/v5/selector.go +++ b/handler/socks/v5/selector.go @@ -29,7 +29,7 @@ func (s *serverSelector) Select(methods ...uint8) (method uint8) { s.logger.Debugf("%d %d %v", gosocks5.Ver5, len(methods), methods) method = gosocks5.MethodNoAuth for _, m := range methods { - if m == socks.MethodTLS && !s.noTLS { + if m == socks.MethodTLS && !s.noTLS && s.TLSConfig != nil { method = m break }