On Wed, May 14, 2014 at 10:03:35PM -0700, Philip Guenther wrote: > On Wed, May 14, 2014 at 10:02 PM, Philip Guenther <[email protected]>wrote: > > > On Wed, May 14, 2014 at 4:58 AM, Jérémie Courrèges-Anglas > > <[email protected]>wrote: > > ... > > > >> So here's the diff I came up with: > >> - set MSG_TRUNC for atomic protocols only if there is actually a data > >> loss > >> - drop the remaining mbuf(s) if the protocol is atomic *or* it is an > >> empty message > >> > >> I'm running this, and I can't see the downsides, but I could use eyes > >> and comments. > >> > >> Index: kern/uipc_socket.c > >> =================================================================== > >> RCS file: /cvs/src/sys/kern/uipc_socket.c,v > >> retrieving revision 1.127 > >> diff -u -p -r1.127 uipc_socket.c > >> --- kern/uipc_socket.c 7 Apr 2014 10:04:17 -0000 1.127 > >> +++ kern/uipc_socket.c 14 May 2014 02:56:09 -0000 > >> @@ -935,13 +935,15 @@ dontblock: > >> } > >> } > >> > >> - if (m && pr->pr_flags & PR_ATOMIC) { > >> + if (m != NULL && m->m_len != 0 && pr->pr_flags & PR_ATOMIC) > >> + /* Drop the remaining data later. */ > >> flags |= MSG_TRUNC; > >> - if ((flags & MSG_PEEK) == 0) > >> - (void) sbdroprecord(&so->so_rcv); > >> - } > >> + > > > > > > <bikeshed>With the comment 'inside' the 'if', I would probably keep the > > braces.</bikeshed> > > > > > > if ((flags & MSG_PEEK) == 0) { > >> - if (m == NULL) { > >> + if (m != NULL) { > >> + if (m->m_len == 0 || pr->pr_flags & PR_ATOMIC) > >> + sbdroprecord(&so->so_rcv); > >> + } else { > >> /* > >> * First part is an inline SB_EMPTY_FIXUP(). > >> Second > >> * part makes sure sb_lastrecord is up-to-date if > >> > > > ...and that's an ok guenther@. I would suggest prodding claudio@ for good > measure though. >
I wonder what other systems do with regard to fd passing with empty messages. I always had the feeling that this is not allowed but I never looked deeper into the standards defining this. -- :wq Claudio
