]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
Fix race in lock pending
authorJason A. Donenfeld <Jason@zx2c4.com>
Sun, 20 May 2018 01:31:27 +0000 (03:31 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Sun, 20 May 2018 01:31:27 +0000 (03:31 +0200)
timers.go

index ae206cdb72b31bb5c5007baf86862f055d92e118..526db137f425833b3911a80e84b6675ca9bd4720 100644 (file)
--- a/timers.go
+++ b/timers.go
@@ -20,7 +20,7 @@ import (
 
 type Timer struct {
        timer         *time.Timer
-       modifyingLock sync.Mutex
+       modifyingLock sync.RWMutex
        runningLock   sync.Mutex
        isPending     bool
 }
@@ -67,6 +67,12 @@ func (timer *Timer) DelSync() {
        timer.runningLock.Unlock()
 }
 
+func (timer *Timer) IsPending() bool {
+       timer.modifyingLock.RLock()
+       defer timer.modifyingLock.RUnlock()
+       return timer.isPending
+}
+
 func (peer *Peer) timersActive() bool {
        return peer.isRunning.Get() && peer.device != nil && peer.device.isUp.Get() && len(peer.device.peers.keyMap) > 0
 }
@@ -87,7 +93,7 @@ func expiredRetransmitHandshake(peer *Peer) {
                /* We set a timer for destroying any residue that might be left
                 * of a partial exchange.
                 */
-               if peer.timersActive() && !peer.timers.zeroKeyMaterial.isPending {
+               if peer.timersActive() && !peer.timers.zeroKeyMaterial.IsPending() {
                        peer.timers.zeroKeyMaterial.Mod(RejectAfterTime * 3)
                }
        } else {
@@ -140,7 +146,7 @@ func expiredPersistentKeepalive(peer *Peer) {
 
 /* Should be called after an authenticated data packet is sent. */
 func (peer *Peer) timersDataSent() {
-       if peer.timersActive() && !peer.timers.newHandshake.isPending {
+       if peer.timersActive() && !peer.timers.newHandshake.IsPending() {
                peer.timers.newHandshake.Mod(KeepaliveTimeout + RekeyTimeout)
        }
 }
@@ -148,7 +154,7 @@ func (peer *Peer) timersDataSent() {
 /* Should be called after an authenticated data packet is received. */
 func (peer *Peer) timersDataReceived() {
        if peer.timersActive() {
-               if !peer.timers.sendKeepalive.isPending {
+               if !peer.timers.sendKeepalive.IsPending() {
                        peer.timers.sendKeepalive.Mod(KeepaliveTimeout)
                } else {
                        peer.timers.needAnotherKeepalive = true