Bug 219159 - sendmsg hangs (or EWOULDBLOCK) forever with ancillary data.
Summary: sendmsg hangs (or EWOULDBLOCK) forever with ancillary data.
Status: New
Alias: None
Product: Base System
Classification: Unclassified
Component: kern (show other bugs)
Version: 10.3-STABLE
Hardware: Any Any
: --- Affects Some People
Assignee: freebsd-bugs mailing list
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-05-09 07:40 UTC by Duane
Modified: 2017-05-09 07:40 UTC (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Duane 2017-05-09 07:40:33 UTC
When sending a message over a SOCK_DGRAM that has control data `sosend_generic()` in `sys/kern/uipc_socket.c` checks `if ((atomic && resid > so->so_snd.sb_hiwat) ...` to return `ESMSGSIZE` but then next checks `if (space < resid + clen && (atomic || ...` and either returns `EWOULDBLOCK` or waits in `sbwait()` and then restarts.

`space` is calculated from `sbspace(&so->so_snd)` which is calculated to be the minimum of `sb_hiwat - sb_cc` and another value, and so strictly less or equal to `so->so_snd.sb_hiwat`.

This means then that if it is the case that `resid <= so->so_snd.sb_hiwat` but `resid + clen > so->so_snd.sb_hiwat` the code will always pass the first test and always fail the second and so will loop forever via the `goto restart` instruction.

I believe the it should be the case that `if ((atomic && resid + clen > so->so_snd.sb_hiwat) ...` the error `ESMSGSIZE` will be returned.

This may be related to 181092.