From 46bdbb38780b854403fb54592b840d281dff9110 Mon Sep 17 00:00:00 2001 From: Andrew Dunham Date: Fri, 5 Jan 2024 11:23:30 -0500 Subject: [PATCH] cmd/tailscaled, tsnet: don't return an interface containing a nil pointer This tripped me up when I was testing something and wrote: if conn != nil { conn.Close() } In netstack mode, when an error occurred we were getting a non-nil error and a non-nil interface that contained a nil pointer. Instead, just return a nil interface value. Updates #cleanup Signed-off-by: Andrew Dunham Change-Id: Id9ef3dd24529e0e8c53adc60ed914c31fbb10cc4 --- cmd/tailscaled/tailscaled.go | 8 +++++++- tsnet/tsnet.go | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/tailscaled/tailscaled.go b/cmd/tailscaled/tailscaled.go index 390c6f39e..9eada2b25 100644 --- a/cmd/tailscaled/tailscaled.go +++ b/cmd/tailscaled/tailscaled.go @@ -511,7 +511,13 @@ func getLocalBackend(ctx context.Context, logf logger.Logf, logID logid.PublicID return ok } dialer.NetstackDialTCP = func(ctx context.Context, dst netip.AddrPort) (net.Conn, error) { - return ns.DialContextTCP(ctx, dst) + // Note: don't just return ns.DialContextTCP or we'll + // return an interface containing a nil pointer. + tcpConn, err := ns.DialContextTCP(ctx, dst) + if err != nil { + return nil, err + } + return tcpConn, nil } } if socksListener != nil || httpProxyListener != nil { diff --git a/tsnet/tsnet.go b/tsnet/tsnet.go index 29e122a08..3c34a94c5 100644 --- a/tsnet/tsnet.go +++ b/tsnet/tsnet.go @@ -546,7 +546,13 @@ func (s *Server) start() (reterr error) { return ok } s.dialer.NetstackDialTCP = func(ctx context.Context, dst netip.AddrPort) (net.Conn, error) { - return ns.DialContextTCP(ctx, dst) + // Note: don't just return ns.DialContextTCP or we'll + // return an interface containing a nil pointer. + tcpConn, err := ns.DialContextTCP(ctx, dst) + if err != nil { + return nil, err + } + return tcpConn, nil } if s.Store == nil {