ipn: allow b to be nil in NewBackendServer

A couple of code paths in ipnserver use a NewBackendServer with a nil
backend just to call the callback with an encapsulated error message.
This covers a panic case seen in logs.

For #1920

Signed-off-by: David Crawshaw <crawshaw@tailscale.com>
pull/1955/head
David Crawshaw 4 years ago committed by David Crawshaw
parent e2dcf63420
commit 293a2b11cd

@ -104,7 +104,9 @@ func NewBackendServer(logf logger.Logf, b Backend, sendNotifyMsg func(Notify)) *
b: b, b: b,
sendNotifyMsg: sendNotifyMsg, sendNotifyMsg: sendNotifyMsg,
} }
if sendNotifyMsg != nil { // b may be nil if the BackendServer is being created just to
// encapsulate and send an error message.
if sendNotifyMsg != nil && b != nil {
b.SetNotifyCallback(bs.send) b.SetNotifyCallback(bs.send)
} }
return bs return bs

@ -187,3 +187,17 @@ func TestClientServer(t *testing.T) {
}) })
flushUntil(Running) flushUntil(Running)
} }
func TestNilBackend(t *testing.T) {
var called *Notify
bs := NewBackendServer(t.Logf, nil, func(n Notify) {
called = &n
})
bs.SendErrorMessage("Danger, Will Robinson!")
if called == nil {
t.Errorf("expect callback to be called, wasn't")
}
if called.ErrMessage == nil || *called.ErrMessage != "Danger, Will Robinson!" {
t.Errorf("callback got wrong error: %v", called.ErrMessage)
}
}

Loading…
Cancel
Save