ipn/ipnlocal: fix null dereference for early suggested exit node queries (#11885)

Fixes tailscale/corp#19558

A request for the suggested exit nodes that occurs too early in the
VPN lifecycle would result in a null deref of the netmap and/or
the netcheck report.  This checks both and errors out.

Signed-off-by: Jonathan Nobels <jonathan@tailscale.com>
pull/11889/head
Jonathan Nobels 7 months ago committed by GitHub
parent 745931415c
commit 71e9258ad9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -6253,6 +6253,7 @@ func mayDeref[T any](p *T) (v T) {
} }
var ErrNoPreferredDERP = errors.New("no preferred DERP, try again later") var ErrNoPreferredDERP = errors.New("no preferred DERP, try again later")
var ErrCannotSuggestExitNode = errors.New("unable to suggest an exit node, try again later")
// SuggestExitNode computes a suggestion based on the current netmap and last netcheck report. If // SuggestExitNode computes a suggestion based on the current netmap and last netcheck report. If
// there are multiple equally good options, one is selected at random, so the result is not stable. To be // there are multiple equally good options, one is selected at random, so the result is not stable. To be
@ -6266,6 +6267,9 @@ func (b *LocalBackend) SuggestExitNode() (response apitype.ExitNodeSuggestionRes
lastReport := b.MagicConn().GetLastNetcheckReport(b.ctx) lastReport := b.MagicConn().GetLastNetcheckReport(b.ctx)
netMap := b.netMap netMap := b.netMap
b.mu.Unlock() b.mu.Unlock()
if lastReport == nil || netMap == nil {
return response, ErrCannotSuggestExitNode
}
seed := time.Now().UnixNano() seed := time.Now().UnixNano()
r := rand.New(rand.NewSource(seed)) r := rand.New(rand.NewSource(seed))
return suggestExitNode(lastReport, netMap, r) return suggestExitNode(lastReport, netMap, r)

Loading…
Cancel
Save