aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/timers.c
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-10-25 14:49:32 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-10-25 14:49:32 +0200
commit6fedf35005ddeec21a73fb299e1f5a2cd772f96b (patch)
treedc259e2dcc7c74505807723c22585405e9ddd896 /src/timers.c
parentpeer: another peer_remove cleanup (diff)
downloadwireguard-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.c8
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))