diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-10-25 14:49:32 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-10-25 14:49:32 +0200 |
commit | 6fedf35005ddeec21a73fb299e1f5a2cd772f96b (patch) | |
tree | dc259e2dcc7c74505807723c22585405e9ddd896 /src/timers.c | |
parent | peer: another peer_remove cleanup (diff) | |
download | wireguard-monolithic-historical-6fedf35005ddeec21a73fb299e1f5a2cd772f96b.tar.xz wireguard-monolithic-historical-6fedf35005ddeec21a73fb299e1f5a2cd772f96b.zip |
global: do not allow compiler to reorder is_valid or is_dead
Suggested-by: Jann Horn <jann@thejh.net>
Diffstat (limited to 'src/timers.c')
-rw-r--r-- | src/timers.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/timers.c b/src/timers.c index 0312bd8..22eb1ee 100644 --- a/src/timers.c +++ b/src/timers.c @@ -39,7 +39,8 @@ static inline void mod_peer_timer(struct wg_peer *peer, unsigned long expires) { rcu_read_lock_bh(); - if (likely(netif_running(peer->device->dev) && !peer->is_dead)) + if (likely(netif_running(peer->device->dev) && + !READ_ONCE(peer->is_dead))) mod_timer(timer, expires); rcu_read_unlock_bh(); } @@ -48,7 +49,8 @@ static inline void del_peer_timer(struct wg_peer *peer, struct timer_list *timer) { rcu_read_lock_bh(); - if (likely(netif_running(peer->device->dev) && !peer->is_dead)) + if (likely(netif_running(peer->device->dev) && + !READ_ONCE(peer->is_dead))) del_timer(timer); rcu_read_unlock_bh(); } @@ -136,7 +138,7 @@ static void wg_expired_zero_key_material(struct timer_list *timer) return; rcu_read_lock_bh(); - if (!peer->is_dead) { + if (!READ_ONCE(peer->is_dead)) { /* Should take our reference. */ if (!queue_work(peer->device->handshake_send_wq, &peer->clear_peer_work)) |