Skip to content

bugfix: silent dataloss in udp socket send_to_many call (sendmmsg).#71

Open
lvboudre wants to merge 2 commits intomullvad:mainfrom
lvboudre:fix-send-to-many
Open

bugfix: silent dataloss in udp socket send_to_many call (sendmmsg).#71
lvboudre wants to merge 2 commits intomullvad:mainfrom
lvboudre:fix-send-to-many

Conversation

@lvboudre
Copy link

@lvboudre lvboudre commented Jan 26, 2026

Problem

The current implementation of send_many_to calls packets.clear() regardless of the return value of the sendmmsg syscall. On Linux, sendmmsg is not atomic; it iterates through the provided headers and may return early if the socket's send buffer (SO_SNDBUF) becomes full or if the kernel encounters backpressure.

When this happens, sendmmsg returns the number of messages successfully queued (which may be less than the total requested). By calling .clear(), we were silently dropping any packets that the kernel had not yet accepted.

Solution

this PR makes sure we loop over all remaining packet until they are all succesfully sent to the kernel.


This change is Reviewable

@lvboudre
Copy link
Author

lvboudre commented Jan 29, 2026

I deleted unit test that I have written, for some reason they don't work on your runner :/ .
In order to create the bug you have to send alot of data really fast, so a little bit hard to reproduce in unit test.

@dlon
Copy link
Member

dlon commented Jan 31, 2026

Nice find! Looks good to me. We're discussing licenses right now, which prevents us from accepting outside contributions, but we'll get back to you asap.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants