diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-08-01 19:09:18 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-08-02 07:40:26 +0200 |
commit | 6c51343dba4d3059e18b047ee52d1219c2ab7816 (patch) | |
tree | b40bf8a9c937622d7c22824490a6e9057ceeb6b0 /src/receive.c | |
parent | queueing: document double-adding and reference conditions (diff) | |
download | wireguard-monolithic-historical-6c51343dba4d3059e18b047ee52d1219c2ab7816.tar.xz wireguard-monolithic-historical-6c51343dba4d3059e18b047ee52d1219c2ab7816.zip |
queueing: ensure strictly ordered loads and stores
We don't want a consumer to read plaintext when it's supposed to be
reading ciphertext, which means we need to synchronize across cores.
Suggested-by: Jann Horn <jann@thejh.net>
Diffstat (limited to 'src/receive.c')
-rw-r--r-- | src/receive.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/src/receive.c b/src/receive.c index 5e231c9..12af8ed 100644 --- a/src/receive.c +++ b/src/receive.c @@ -382,7 +382,7 @@ int packet_rx_poll(struct napi_struct *napi, int budget) if (unlikely(budget <= 0)) return 0; - while ((skb = __ptr_ring_peek(&queue->ring)) != NULL && (state = atomic_read(&PACKET_CB(skb)->state)) != PACKET_STATE_UNCRYPTED) { + while ((skb = __ptr_ring_peek(&queue->ring)) != NULL && (state = atomic_read_acquire(&PACKET_CB(skb)->state)) != PACKET_STATE_UNCRYPTED) { __ptr_ring_discard_one(&queue->ring); peer = PACKET_PEER(skb); keypair = PACKET_CB(skb)->keypair; |