diff options
author | Josh Bleecher Snyder <josh@tailscale.com> | 2020-12-04 15:36:21 -0800 |
---|---|---|
committer | Josh Bleecher Snyder <josh@tailscale.com> | 2020-12-08 14:25:02 -0800 |
commit | d3ff2d6b62b095f37582affe84e267d7e5be88c6 (patch) | |
tree | 9d97ec1ba73e2d7024bc3593c29c679763ad62c1 /device | |
parent | 01d3aaa7f418dd0ca86643ddcc8c82544cb8398b (diff) |
device: clear pointers when returning elems to pools
Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
Diffstat (limited to 'device')
-rw-r--r-- | device/pools.go | 2 | ||||
-rw-r--r-- | device/receive.go | 11 | ||||
-rw-r--r-- | device/send.go | 12 |
3 files changed, 24 insertions, 1 deletions
diff --git a/device/pools.go b/device/pools.go index e778d2e..6939eeb 100644 --- a/device/pools.go +++ b/device/pools.go @@ -65,6 +65,7 @@ func (device *Device) GetInboundElement() *QueueInboundElement { } func (device *Device) PutInboundElement(msg *QueueInboundElement) { + msg.clearPointers() if PreallocatedBuffersPerPool == 0 { device.pool.inboundElementPool.Put(msg) } else { @@ -81,6 +82,7 @@ func (device *Device) GetOutboundElement() *QueueOutboundElement { } func (device *Device) PutOutboundElement(msg *QueueOutboundElement) { + msg.clearPointers() if PreallocatedBuffersPerPool == 0 { device.pool.outboundElementPool.Put(msg) } else { diff --git a/device/receive.go b/device/receive.go index e4a94b5..0a8228c 100644 --- a/device/receive.go +++ b/device/receive.go @@ -37,6 +37,17 @@ type QueueInboundElement struct { endpoint conn.Endpoint } +// clearPointers clears elem fields that contain pointers. +// This makes the garbage collector's life easier and +// avoids accidentally keeping other objects around unnecessarily. +// It also reduces the possible collateral damage from use-after-free bugs. +func (elem *QueueInboundElement) clearPointers() { + elem.buffer = nil + elem.packet = nil + elem.keypair = nil + elem.endpoint = nil +} + func (elem *QueueInboundElement) Drop() { atomic.StoreInt32(&elem.dropped, AtomicTrue) } diff --git a/device/send.go b/device/send.go index fa4da0e..cb3e3f6 100644 --- a/device/send.go +++ b/device/send.go @@ -58,9 +58,19 @@ func (device *Device) NewOutboundElement() *QueueOutboundElement { elem.buffer = device.GetMessageBuffer() elem.Mutex = sync.Mutex{} elem.nonce = 0 + // keypair and peer were cleared (if necessary) by clearPointers. + return elem +} + +// clearPointers clears elem fields that contain pointers. +// This makes the garbage collector's life easier and +// avoids accidentally keeping other objects around unnecessarily. +// It also reduces the possible collateral damage from use-after-free bugs. +func (elem *QueueOutboundElement) clearPointers() { + elem.buffer = nil + elem.packet = nil elem.keypair = nil elem.peer = nil - return elem } func (elem *QueueOutboundElement) Drop() { |