]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
Fixup buffer freeing
authorJason A. Donenfeld <Jason@zx2c4.com>
Sun, 16 Sep 2018 22:43:23 +0000 (00:43 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Sat, 22 Sep 2018 03:43:03 +0000 (05:43 +0200)
device.go
receive.go
send.go

index b1f3569d05e89238ccd2027880ec9a8706d14a15..bbcd0fc4afba0d836b6b57f2d84c660c237748ea 100644 (file)
--- a/device.go
+++ b/device.go
@@ -19,8 +19,7 @@ const (
        DeviceRoutineNumberAdditional = 2
 )
 
-
-const preallocatedBuffers = 0
+var preallocatedBuffers = 0
 
 type Device struct {
        isUp     AtomicBool // device is (going) up
index 6b6543c2d094a8b2df2a2b803cba8eaa4d1fcdf5..9bf3af3ca81fc812e9cd2563bc7d6e731e6527ed 100644 (file)
@@ -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)
                        }
diff --git a/send.go b/send.go
index bc0f5e4e01809d2c6d93dc873687dcf4b5a31315..24e2f39549818280013debf6e2baa11907ec7412 100644 (file)
--- a/send.go
+++ b/send.go
@@ -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 {