Fix race in lock pending
This commit is contained in:
parent
0a68c1ab17
commit
7c21a3de0a
14
timers.go
14
timers.go
@ -20,7 +20,7 @@ import (
|
|||||||
|
|
||||||
type Timer struct {
|
type Timer struct {
|
||||||
timer *time.Timer
|
timer *time.Timer
|
||||||
modifyingLock sync.Mutex
|
modifyingLock sync.RWMutex
|
||||||
runningLock sync.Mutex
|
runningLock sync.Mutex
|
||||||
isPending bool
|
isPending bool
|
||||||
}
|
}
|
||||||
@ -67,6 +67,12 @@ func (timer *Timer) DelSync() {
|
|||||||
timer.runningLock.Unlock()
|
timer.runningLock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (timer *Timer) IsPending() bool {
|
||||||
|
timer.modifyingLock.RLock()
|
||||||
|
defer timer.modifyingLock.RUnlock()
|
||||||
|
return timer.isPending
|
||||||
|
}
|
||||||
|
|
||||||
func (peer *Peer) timersActive() bool {
|
func (peer *Peer) timersActive() bool {
|
||||||
return peer.isRunning.Get() && peer.device != nil && peer.device.isUp.Get() && len(peer.device.peers.keyMap) > 0
|
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
|
/* We set a timer for destroying any residue that might be left
|
||||||
* of a partial exchange.
|
* of a partial exchange.
|
||||||
*/
|
*/
|
||||||
if peer.timersActive() && !peer.timers.zeroKeyMaterial.isPending {
|
if peer.timersActive() && !peer.timers.zeroKeyMaterial.IsPending() {
|
||||||
peer.timers.zeroKeyMaterial.Mod(RejectAfterTime * 3)
|
peer.timers.zeroKeyMaterial.Mod(RejectAfterTime * 3)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -140,7 +146,7 @@ func expiredPersistentKeepalive(peer *Peer) {
|
|||||||
|
|
||||||
/* Should be called after an authenticated data packet is sent. */
|
/* Should be called after an authenticated data packet is sent. */
|
||||||
func (peer *Peer) timersDataSent() {
|
func (peer *Peer) timersDataSent() {
|
||||||
if peer.timersActive() && !peer.timers.newHandshake.isPending {
|
if peer.timersActive() && !peer.timers.newHandshake.IsPending() {
|
||||||
peer.timers.newHandshake.Mod(KeepaliveTimeout + RekeyTimeout)
|
peer.timers.newHandshake.Mod(KeepaliveTimeout + RekeyTimeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,7 +154,7 @@ func (peer *Peer) timersDataSent() {
|
|||||||
/* Should be called after an authenticated data packet is received. */
|
/* Should be called after an authenticated data packet is received. */
|
||||||
func (peer *Peer) timersDataReceived() {
|
func (peer *Peer) timersDataReceived() {
|
||||||
if peer.timersActive() {
|
if peer.timersActive() {
|
||||||
if !peer.timers.sendKeepalive.isPending {
|
if !peer.timers.sendKeepalive.IsPending() {
|
||||||
peer.timers.sendKeepalive.Mod(KeepaliveTimeout)
|
peer.timers.sendKeepalive.Mod(KeepaliveTimeout)
|
||||||
} else {
|
} else {
|
||||||
peer.timers.needAnotherKeepalive = true
|
peer.timers.needAnotherKeepalive = true
|
||||||
|
Loading…
Reference in New Issue
Block a user