public inbox for wireguard@lists.zx2c4.com
 help / color / mirror / Atom feed
* [PATCH 0/1] This PR fixes a critical race condition in the Wintun driver that causes ring buffer overruns
@ 2026-02-19 19:32 odedkatz
  2026-02-19 19:32 ` [PATCH 1/1] in order to prevent buffer overrun (which was observed while sending multiple high throughput UDP streams from different threads) I move the driver spinlock to protect Ring buffer Head odedkatz
  0 siblings, 1 reply; 8+ messages in thread
From: odedkatz @ 2026-02-19 19:32 UTC (permalink / raw)
  To: wireguard; +Cc: odedk, odedkatz

** Description **
This PR fixes a critical race condition in the Wintun driver that causes ring buffer overruns when multiple UDP senders operate in parallel. The issue occurred because multiple threads could read the same Ring->Head value without synchronization, leading to concurrent modifications that corrupted the ring buffer and resulted in ERROR_INVALID_DATA errors.

** Changes **
Extended the critical section in TunSendNetBufferLists by moving spinlock acquisition before reading Ring->Head, ensuring atomic read-modify-write operations on the ring buffer state
Fixed the lock release timing in TunReturnNetBufferLists to occur after updating Ring->Head, ensuring consistency between the active NBL list and ring buffer head pointer

** History **
the issue was reported to wireguard

```
We were trying to integrate `wintun` into our product and while
testing we found an issue with upload of high UDP throughput on
multiple sockets. initially we thought it may be related to our
integration. but we managed to find the same issue in your example
code.we tried to do some debugging on the example, but it seems like
the corruption is on the driver side.
the way to reproduce this issue- run the example
- run the `send_udp.py` (the attached python script) on 2 different
command terminals
   - `send_udp.py 10.6.7.8 5201 1450`
   - `send_udp.py 10.6.7.8 5201 1400`after some time the
`WintunReceivePacket` returns NULL and `GetLastError()` return 13
(`ERROR_INVALID_DATA`)
many thanks,
```

a fix was provided by wireguard with [this commit](https://git.zx2c4.com/wintun/commit/driver/wintun.c?id=8814f660310c30a9297fc640c844c4ab6f27e5d7), but it didn't solve the issue.


odedkatz (1):
  in order to prevent buffer overrun (which was observed while sending
    multiple high throughput UDP streams from different threads) I move
    the driver spinlock to protect Ring buffer Head.

 driver/wintun.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-03-11 23:35 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-19 19:32 [PATCH 0/1] This PR fixes a critical race condition in the Wintun driver that causes ring buffer overruns odedkatz
2026-02-19 19:32 ` [PATCH 1/1] in order to prevent buffer overrun (which was observed while sending multiple high throughput UDP streams from different threads) I move the driver spinlock to protect Ring buffer Head odedkatz
2026-02-20  7:28   ` Simon Rozman
2026-02-20 16:55     ` Oded Katz
2026-02-27 21:28       ` Oded Katz
2026-02-27 22:03         ` Simon Rozman
2026-02-28  1:12           ` Oded Katz
2026-03-11 23:35     ` Oded Katz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox