Date: Tue, 09 May 2017 07:40:33 +0000 From: bugzilla-noreply@freebsd.org To: freebsd-bugs@FreeBSD.org Subject: [Bug 219159] sendmsg hangs (or EWOULDBLOCK) forever with ancillary data. Message-ID: <bug-219159-8@https.bugs.freebsd.org/bugzilla/>
next in thread | raw e-mail | index | archive | help
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D219159 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@FreeBSD.org Reporter: parakleta@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 (s= pace < 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 eq= ual to `so->so_snd.sb_hiwat`. This means then that if it is the case that `resid <=3D so->so_snd.sb_hiwat= ` but `resid + clen > so->so_snd.sb_hiwat` the code will always pass the first te= st 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. --=20 You are receiving this mail because: You are the assignee for the bug.=
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-219159-8>