summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josh@tailscale.com>2020-12-14 13:34:03 -0800
committerJason A. Donenfeld <Jason@zx2c4.com>2021-01-07 14:49:44 +0100
commitfc0aabbae94f8da498c8fab89b833b4e7a3abab6 (patch)
treeeeb2983913169f87e129d1e7cd295bd0efde49c6
parentc9e4a859ae8cdd7046a467afe8b50c5364c2cfc7 (diff)
device: prevent spurious errors while closing a device
When closing a device, packets that are in flight can make it to SendBuffer, which then returns an error. Those errors add noise but no light; they do not reflect an actual problem. Adding the synchronization required to prevent this from occurring is currently expensive and error-prone. Instead, quietly drop such packets instead of returning an error. Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
-rw-r--r--device/peer.go5
1 files changed, 5 insertions, 0 deletions
diff --git a/device/peer.go b/device/peer.go
index 02e145c..c2397cc 100644
--- a/device/peer.go
+++ b/device/peer.go
@@ -140,6 +140,11 @@ func (peer *Peer) SendBuffer(buffer []byte) error {
defer peer.device.net.RUnlock()
if peer.device.net.bind == nil {
+ // Packets can leak through to SendBuffer while the device is closing.
+ // When that happens, drop them silently to avoid spurious errors.
+ if peer.device.isClosed.Get() {
+ return nil
+ }
return errors.New("no bind")
}