Fix tailscale panic with IP control URL

This commit is contained in:
世界
2026-08-03 13:09:04 +08:00
parent a29b4ea1e8
commit d763884442

View File

@@ -9,7 +9,6 @@ import (
"net" "net"
"net/http" "net/http"
"net/netip" "net/netip"
"net/url"
"os" "os"
"path/filepath" "path/filepath"
"reflect" "reflect"
@@ -189,27 +188,17 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
} else { } else {
udpTimeout = C.UDPTimeout udpTimeout = C.UDPTimeout
} }
var remoteIsDomain bool
if options.ControlURL != "" {
controlURL, err := url.Parse(options.ControlURL)
if err != nil {
return nil, E.Cause(err, "parse control URL")
}
remoteIsDomain = M.ParseSocksaddr(controlURL.Hostname()).IsDomain()
} else {
// controlplane.tailscale.com
remoteIsDomain = true
}
outboundDialer, err := dialer.NewWithOptions(dialer.Options{ outboundDialer, err := dialer.NewWithOptions(dialer.Options{
Context: ctx, Context: ctx,
Options: options.DialerOptions, Options: options.DialerOptions,
RemoteIsDomain: remoteIsDomain, RemoteIsDomain: true,
ResolverOnDetour: true, ResolverOnDetour: true,
NewDialer: true, NewDialer: true,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
dialerQueryOptions := outboundDialer.(dialer.ResolveDialer).QueryOptions()
dnsRouter := service.FromContext[adapter.DNSRouter](ctx) dnsRouter := service.FromContext[adapter.DNSRouter](ctx)
server := &tsnet.Server{ server := &tsnet.Server{
Dir: stateDirectory, Dir: stateDirectory,
@@ -226,7 +215,7 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
AdvertiseTags: options.AdvertiseTags, AdvertiseTags: options.AdvertiseTags,
Dialer: &endpointDialer{Dialer: outboundDialer, logger: logger}, Dialer: &endpointDialer{Dialer: outboundDialer, logger: logger},
LookupHook: func(ctx context.Context, host string) ([]netip.Addr, error) { LookupHook: func(ctx context.Context, host string) ([]netip.Addr, error) {
return dnsRouter.Lookup(ctx, host, outboundDialer.(dialer.ResolveDialer).QueryOptions()) return dnsRouter.Lookup(ctx, host, dialerQueryOptions)
}, },
DNS: &dnsConfigurtor{}, DNS: &dnsConfigurtor{},
HTTPClient: &http.Client{ HTTPClient: &http.Client{
@@ -247,7 +236,7 @@ func NewEndpoint(ctx context.Context, router adapter.Router, logger log.ContextL
ctx: ctx, ctx: ctx,
router: router, router: router,
logger: logger, logger: logger,
queryOptions: outboundDialer.(dialer.ResolveDialer).QueryOptions(), queryOptions: dialerQueryOptions,
dnsRouter: dnsRouter, dnsRouter: dnsRouter,
network: service.FromContext[adapter.NetworkManager](ctx), network: service.FromContext[adapter.NetworkManager](ctx),
platformInterface: service.FromContext[adapter.PlatformInterface](ctx), platformInterface: service.FromContext[adapter.PlatformInterface](ctx),