syncconf: account for persistent keepalive removed from config file

Otherwise removing a persistent keepalive from a config file wouldn't
reflect on the runtime state.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2025-05-23 20:22:37 +02:00
parent ede2c48042
commit 0a81a174db

View file

@ -91,11 +91,21 @@ static bool sync_conf(struct wgdevice *file)
file->first_peer = peer;
if (!file->last_peer)
file->last_peer = peer;
} else if (i < peer_count - 1 && peers[i + 1].from_file &&
(peers[i].peer->flags & WGPEER_HAS_PRESHARED_KEY) && !(peers[i + 1].peer->flags & WGPEER_HAS_PRESHARED_KEY) &&
!memcmp(peers[i].peer->public_key, peers[i + 1].peer->public_key, WG_KEY_LEN)) {
memset(peers[i + 1].peer->preshared_key, 0, WG_KEY_LEN);
peers[i + 1].peer->flags |= WGPEER_HAS_PRESHARED_KEY;
} else {
if (i < peer_count - 1 && peers[i + 1].from_file &&
(peers[i].peer->flags & WGPEER_HAS_PRESHARED_KEY) &&
!(peers[i + 1].peer->flags & WGPEER_HAS_PRESHARED_KEY) &&
!memcmp(peers[i].peer->public_key, peers[i + 1].peer->public_key, WG_KEY_LEN)) {
memset(peers[i + 1].peer->preshared_key, 0, WG_KEY_LEN);
peers[i + 1].peer->flags |= WGPEER_HAS_PRESHARED_KEY;
}
if (i < peer_count - 1 && peers[i + 1].from_file &&
peers[i].peer->persistent_keepalive_interval &&
!(peers[i + 1].peer->flags & WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL) &&
!memcmp(peers[i].peer->public_key, peers[i + 1].peer->public_key, WG_KEY_LEN)) {
peers[i + 1].peer->persistent_keepalive_interval = 0;
peers[i + 1].peer->flags |= WGPEER_HAS_PERSISTENT_KEEPALIVE_INTERVAL;
}
}
}
free_wgdevice(runtime);