mirror of
https://git.zx2c4.com/wireguard-go
synced 2024-11-15 09:15:14 +01:00
device: drop lock before expiring keys
This commit is contained in:
parent
4e3018a967
commit
4be9630ddc
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user