Skip site navigation (1)Skip section navigation (2)
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>