You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailscale/ipn/ipnlocal
Alex Chan b38dd1ae06 ipn/ipnlocal: don't panic if there are no suitable exit nodes
In suggestExitNodeLocked, if no exit node candidates have a home DERP or
valid location info, `bestCandidates` is an empty slice. This slice is
passed to `selectNode` (`randomNode` in prod):

```go func randomNode(nodes views.Slice[tailcfg.NodeView], …) tailcfg.NodeView {
	…
	return nodes.At(rand.IntN(nodes.Len()))
}
```

An empty slice becomes a call to `rand.IntN(0)`, which panics.

This patch changes the behaviour, so if we've filtered out all the
candidates before calling `selectNode`, reset the list and then pick
from any of the available candidates.

This patch also updates our tests to give us more coverage of `randomNode`,
so we can spot other potential issues.

Updates #17661

Change-Id: I63eb5e4494d45a1df5b1f4b1b5c6d5576322aa72
Signed-off-by: Alex Chan <alexc@tailscale.com>
1 week ago
..
testdata ipn/ipnlocal: fix the path for writing cert files (#7203) 3 years ago
breaktcp_darwin.go cmd/tailscale: add debug commands to break connections 2 years ago
breaktcp_linux.go cmd/tailscale: add debug commands to break connections 2 years ago
bus.go ipn/local: add the suggested exit node to the ipn bus (#16748) 3 months ago
bus_test.go ipn/ipnlocal: add IPN Bus NotifyRateLimit watch bit NotifyRateLimit 1 year ago
c2n.go types/netmap: remove PrivateKey from NetworkMap 2 weeks ago
c2n_pprof.go ipn/ipnlocal, engine: avoid runtime/pprof with two usages of ts_omit_debug 2 months ago
c2n_test.go types/netmap,*: remove some redundant fields from NetMap 2 weeks ago
captiveportal.go feature/featuretags: add build tag to remove captive portal detection 2 months ago
cert.go syncs: add Mutex/RWMutex alias/wrappers for future mutex debugging 2 weeks ago
cert_disabled.go feature/featuretags, all: add ts_omit_acme to disable TLS cert support 3 months ago
cert_test.go ipn/ipnlocal, envknob: make it possible to configure the cert client to act in read-only mode (#15250) 9 months ago
dnsconfig_test.go types/netmap,*: remove some redundant fields from NetMap 2 weeks ago
drive.go ipn/ipnlocal: fix panic in driveTransport on network error 1 week ago
drive_test.go ipn/ipnlocal: fix panic in driveTransport on network error 1 week ago
drive_tomove.go feature/drive: start factoring out Taildrive, add ts_omit_drive build tag 3 months ago
expiry.go ipn/ipnlocal: use eventbus.SubscribeFunc in expiryManager 2 months ago
expiry_test.go control/controlclient: introduce eventbus messages instead of callbacks (#16956) 3 months ago
extension_host.go ipn/ipnlocal: make GetExt work earlier, before extension init 7 months ago
extension_host_test.go health,ipn/ipnlocal: introduce eventbus in heath.Tracker (#17085) 3 months ago
hwattest.go Revert "control/controlclient: back out HW key attestation (#17664)" (#17732) 1 month ago
local.go ipn/ipnlocal: don't panic if there are no suitable exit nodes 1 week ago
local_test.go ipn/ipnlocal: don't panic if there are no suitable exit nodes 1 week ago
loglines_test.go health,ipn/ipnlocal: introduce eventbus in heath.Tracker (#17085) 3 months ago
netstack.go ipn/ipnlocal: move last unconditional gvisor import, complete ts_omit_netstack support 2 months ago
network-lock.go ipn/ipnlocal: remove the always-true CanSupportNetworkLock() 2 weeks ago
network-lock_test.go ipn/ipnlocal: reduce profileManager boilerplate in network-lock tests 2 weeks ago
node_backend.go types/netmap,*: remove some redundant fields from NetMap 2 weeks ago
node_backend_test.go ipn/ipnlocal: introduce the concept of client-side-reachability (#17367) 2 months ago
peerapi.go feature/featuretags: add features for c2n, peerapi, advertise/use routes/exit nodes 2 months ago
peerapi_drive.go feature/drive: start factoring out Taildrive, add ts_omit_drive build tag 3 months ago
peerapi_macios_ext.go net/netmon, add: add netmon.State type alias of interfaces.State 2 years ago
peerapi_test.go ipn/ipnlocal: fix another racy test (#17472) 2 months ago
prefs_metrics.go feature/featuretags: add features for c2n, peerapi, advertise/use routes/exit nodes 2 months ago
profiles.go types/netmap: remove PrivateKey from NetworkMap 2 weeks ago
profiles_notwindows.go ipn/ipnlocal: refactor and cleanup profileManager 1 year ago
profiles_test.go ipn{,/local},cmd/tailscale: add "sync" flag and pref to disable control map poll 2 weeks ago
profiles_windows.go ipn/ipnlocal: refactor and cleanup profileManager 1 year ago
serve.go ipn/ipnlocal: add validations when setting serve config (#17950) 2 weeks ago
serve_disabled.go all: add ts_omit_serve, start making tailscale serve/funnel be modular 3 months ago
serve_test.go ipn/ipnlocal: add validations when setting serve config (#17950) 2 weeks ago
ssh.go ipn/ipnlocal: fix a case where ts_omit_ssh was still linking in x/crypto/ssh 3 months ago
ssh_stub.go ipn/ipnlocal: fix a case where ts_omit_ssh was still linking in x/crypto/ssh 3 months ago
ssh_test.go health,ipn/ipnlocal: introduce eventbus in heath.Tracker (#17085) 3 months ago
state_test.go types/key,wgengine/magicsock,control/controlclient,ipn: add debug disco key rotation 2 weeks ago
tailnetlock_disabled.go all: add ts_omit_tailnetlock as a start of making it build-time modular 3 months ago
web_client.go util/backoff: rename logtail/backoff package to util/backoff 2 months ago
web_client_stub.go derp/derpserver: split off derp.Server out of derp into its own package 2 months ago