device: drop lock before expiring keys

This commit is contained in:
Jason A. Donenfeld 2019-08-05 17:46:34 +02:00
parent 4e3018a967
commit 4be9630ddc

View File

@ -201,7 +201,6 @@ func (device *Device) IsUnderLoad() bool {
} }
func (device *Device) SetPrivateKey(sk NoisePrivateKey) error { func (device *Device) SetPrivateKey(sk NoisePrivateKey) error {
// lock required resources // lock required resources
device.staticIdentity.Lock() device.staticIdentity.Lock()
@ -214,9 +213,10 @@ func (device *Device) SetPrivateKey(sk NoisePrivateKey) error {
device.peers.Lock() device.peers.Lock()
defer device.peers.Unlock() defer device.peers.Unlock()
lockedPeers := make([]*Peer, 0, len(device.peers.keyMap))
for _, peer := range device.peers.keyMap { for _, peer := range device.peers.keyMap {
peer.handshake.mutex.RLock() peer.handshake.mutex.RLock()
defer peer.handshake.mutex.RUnlock() lockedPeers = append(lockedPeers, peer)
} }
// remove peers with matching public keys // remove peers with matching public keys
@ -238,8 +238,8 @@ func (device *Device) SetPrivateKey(sk NoisePrivateKey) error {
rmKey := device.staticIdentity.privateKey.IsZero() rmKey := device.staticIdentity.privateKey.IsZero()
expiredPeers := make([]*Peer, 0, len(device.peers.keyMap))
for key, peer := range device.peers.keyMap { for key, peer := range device.peers.keyMap {
handshake := &peer.handshake handshake := &peer.handshake
if rmKey { if rmKey {
@ -251,10 +251,17 @@ func (device *Device) SetPrivateKey(sk NoisePrivateKey) error {
if isZero(handshake.precomputedStaticStatic[:]) { if isZero(handshake.precomputedStaticStatic[:]) {
unsafeRemovePeer(device, peer, key) unsafeRemovePeer(device, peer, key)
} else { } else {
peer.ExpireCurrentKeypairs() expiredPeers = append(expiredPeers, peer)
} }
} }
for _, peer := range lockedPeers {
peer.handshake.mutex.RUnlock()
}
for _, peer := range expiredPeers {
peer.ExpireCurrentKeypairs()
}
return nil return nil
} }