diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-09-17 00:43:23 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-09-22 05:43:03 +0200 |
commit | cf81a28dd30bd8714432d2ff108d64c7f4b65e50 (patch) | |
tree | f2b2c502c22ad6b3d006c289f28fd897f4c703a5 | |
parent | 942abf948a9121a4595f782093ca623534997776 (diff) |
Fixup buffer freeing
-rw-r--r-- | device.go | 3 | ||||
-rw-r--r-- | receive.go | 23 | ||||
-rw-r--r-- | send.go | 4 |
3 files changed, 21 insertions, 9 deletions
@@ -19,8 +19,7 @@ const ( DeviceRoutineNumberAdditional = 2 ) - -const preallocatedBuffers = 0 +var preallocatedBuffers = 0 type Device struct { isUp AtomicBool // device is (going) up @@ -279,6 +279,7 @@ func (device *Device) RoutineDecryption() { if err != nil { elem.Drop() device.PutMessageBuffer(elem.buffer) + elem.buffer = nil elem.mutex.Unlock() } elem.mutex.Unlock() @@ -294,18 +295,25 @@ func (device *Device) RoutineHandshake() { logError := device.log.Error logDebug := device.log.Debug + var elem QueueHandshakeElement + var ok bool + defer func() { logDebug.Println("Routine: handshake worker - stopped") device.state.stopping.Done() + if elem.buffer != nil { + device.PutMessageBuffer(elem.buffer) + } }() logDebug.Println("Routine: handshake worker - started") device.state.starting.Done() - var elem QueueHandshakeElement - var ok bool - for { + if elem.buffer != nil { + device.PutMessageBuffer(elem.buffer) + } + select { case elem, ok = <-device.queue.handshake: case <-device.signals.stop: @@ -478,9 +486,14 @@ func (peer *Peer) RoutineSequentialReceiver() { logError := device.log.Error logDebug := device.log.Debug + var elem *QueueInboundElement + defer func() { logDebug.Println(peer, "- Routine: sequential receiver - stopped") peer.routines.stopping.Done() + if elem != nil && elem.buffer != nil { + device.PutMessageBuffer(elem.buffer) + } }() logDebug.Println(peer, "- Routine: sequential receiver - started") @@ -488,6 +501,9 @@ func (peer *Peer) RoutineSequentialReceiver() { peer.routines.starting.Done() for { + if elem != nil && elem.buffer != nil { + device.PutMessageBuffer(elem.buffer) + } select { @@ -608,7 +624,6 @@ func (peer *Peer) RoutineSequentialReceiver() { _, err := device.tun.device.Write( elem.buffer[:offset+len(elem.packet)], offset) - device.PutMessageBuffer(elem.buffer) if err != nil { logError.Println("Failed to write packet to TUN device:", err) } @@ -74,8 +74,7 @@ func addToNonceQueue(queue chan *QueueOutboundElement, element *QueueOutboundEle default: select { case old := <-queue: - old.Drop() - device.PutMessageBuffer(element.buffer) + device.PutMessageBuffer(old.buffer) default: } } @@ -98,7 +97,6 @@ func addToOutboundAndEncryptionQueues(outboundQueue chan *QueueOutboundElement, } } - /* Queues a keepalive if no packets are queued for peer */ func (peer *Peer) SendKeepalive() bool { |