[Bug 219159] sendmsg hangs (or EWOULDBLOCK) forever with ancillary data.
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Tue May 9 07:40:33 UTC 2017
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=219159
Bug ID: 219159
Summary: sendmsg hangs (or EWOULDBLOCK) forever with ancillary
data.
Product: Base System
Version: 10.3-STABLE
Hardware: Any
OS: Any
Status: New
Severity: Affects Some People
Priority: ---
Component: kern
Assignee: freebsd-bugs at FreeBSD.org
Reporter: parakleta at darkreality.org
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.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list