tailscale/ipn
Avery Pennarun 6d10655dc3 ipnlocal: accept a new opts.UpdatePrefs field.
This is needed because the original opts.Prefs field was at some point
subverted for use in frontend->backend state migration for backward
compatibility on some platforms. We still need that feature, but we
also need the feature of providing the full set of prefs from
`tailscale up`, *not* including overwriting the prefs.Persist keys, so
we can't use the original field from `tailscale up`.

`tailscale up` had attempted to compensate for that by doing SetPrefs()
before Start(), but that violates the ipn.Backend contract, which says
you should call Start() before anything else (that's why it's called
Start()). As a result, doing SetPrefs({ControlURL=...,
WantRunning=true}) would cause a connection to the *previous* control
server (because WantRunning=true), and then connect to the *new*
control server only after running Start().

This problem may have been avoided before, but only by pure luck.

It turned out to be relatively harmless since the connection to the old
control server was immediately closed and replaced anyway, but it
created a race condition that could have caused spurious notifications
or rejected keys if the server responded quickly.

As already covered by existing TODOs, a better fix would be to have
Start() get out of the business of state migration altogether. But
we're approaching a release so I want to make the minimum possible fix.

Fixes #1840.

Signed-off-by: Avery Pennarun <apenwarr@tailscale.com>
2021-05-04 15:19:25 -04:00
..
ipnlocal ipnlocal: accept a new opts.UpdatePrefs field. 2021-05-04 15:19:25 -04:00
ipnserver cmd/tailscaled: don't block ipnserver startup behind engine init on Windows 2021-04-20 22:26:27 -07:00
ipnstate ipn/ipnlocal, etc: require file sharing capability to send/recv files 2021-04-16 10:58:19 -07:00
localapi ipn/ipnlocal, etc: require file sharing capability to send/recv files 2021-04-16 10:58:19 -07:00
policy ipn/policy: mark peerapi4 and peerapi6 as interesting services 2021-04-01 11:57:24 -07:00
backend.go ipnlocal: accept a new opts.UpdatePrefs field. 2021-05-04 15:19:25 -04:00
doc.go Move Linux client & common packages into a public repo. 2020-02-09 09:32:57 -08:00
fake_test.go ipn{,/ipnlocal}, cmd/tailscale/cli: don't check pref reverts on initial up 2021-04-18 08:12:18 -07:00
handle.go ipn{,/ipnlocal}, cmd/tailscale/cli: don't check pref reverts on initial up 2021-04-18 08:12:18 -07:00
message_test.go ipn: define NewBackendServer nil as not affecting Backend's NotifyCallback 2021-04-22 15:56:54 -07:00
message.go ipn: define NewBackendServer nil as not affecting Backend's NotifyCallback 2021-04-22 15:56:54 -07:00
prefs_clone.go Add prefs.LoggedOut to fix several state machine bugs. 2021-04-30 09:18:13 -04:00
prefs_test.go Add prefs.LoggedOut to fix several state machine bugs. 2021-04-30 09:18:13 -04:00
prefs.go ipnlocal: accept a new opts.UpdatePrefs field. 2021-05-04 15:19:25 -04:00
store_test.go Add tstest.PanicOnLog(), and fix various problems detected by this. 2020-05-13 23:12:35 -04:00
store.go wgkey: new package 2020-12-30 17:33:02 -08:00