From b2855cfd86425ff1129dfdb3cba120fdfdb19152 Mon Sep 17 00:00:00 2001 From: Mihai Parparita Date: Thu, 13 Oct 2022 11:10:11 -0700 Subject: [PATCH] derp/derphttp: fix nil pointer dereference when closing a netcheck client NewNetcheckClient only initializes a subset of fields of derphttp.Client, and the Close() call added by #5707 was result in a nil pointer dereference. Make Close() safe to call when using NewNetcheckClient() too. Fixes #5919 Signed-off-by: Mihai Parparita --- derp/derphttp/derphttp_client.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/derp/derphttp/derphttp_client.go b/derp/derphttp/derphttp_client.go index 67e947754..f0448d250 100644 --- a/derp/derphttp/derphttp_client.go +++ b/derp/derphttp/derphttp_client.go @@ -96,7 +96,7 @@ func NewRegionClient(privateKey key.NodePrivate, logf logger.Logf, getRegion fun return c } -// NewNetcheckClient returns a Client that's only able to have its DialRegion method called. +// NewNetcheckClient returns a Client that's only able to have its DialRegionTLS method called. // It's used by the netcheck package. func NewNetcheckClient(logf logger.Logf) *Client { return &Client{logf: logf} @@ -985,7 +985,9 @@ func (c *Client) isClosed() bool { // Close closes the client. It will not automatically reconnect after // being closed. func (c *Client) Close() error { - c.cancelCtx() // not in lock, so it can cancel Connect, which holds mu + if c.cancelCtx != nil { + c.cancelCtx() // not in lock, so it can cancel Connect, which holds mu + } c.mu.Lock() defer c.mu.Unlock()