On Tue, 7 Oct 2008, John Baldwin wrote:

On Tuesday 07 October 2008 04:57:55 pm Robert Watson wrote:
rwatson     2008-10-07 20:57:55 UTC

  FreeBSD src repository

  Modified files:
    sys/kern             uipc_socket.c
  Log:
  SVN rev 183675 on 2008-10-07 20:57:55Z by rwatson

  In soreceive_dgram, when a 0-length buffer is passed into recv(2) and
  no data is ready, return 0 rather than blocking or returning EAGAIN.
  This is consistent with the behavior of soreceive_generic (soreceive)
  in earlier versions of FreeBSD, and restores this behavior for UDP.

  Discussed with: jhb, sam
  MFC after:      3 days

I do find this behavior odd though.  I would expect

        recv(fd, NULL, 0)

to discard the next packet from the socket if one is available rather than returning success and not doing anything (and it seems that this is what it does both before and now). Similarly, I would expect recv(fd, NULL, 0) to block on a blocking socket if there isn't a packet available. It would be orthogonal then to return EAGAIN in this case (no packet available, zero-length user buffer) on a non-blocking socket.

It seems that Solaris dropped this behavior (return 0) from their recv() system call sometime after SunOS 4.0 from comments in the OpenSolaris source. From reading __skb_recv_datagram(), it seems that Linux 2.6 returns EAGAIN. NetBSD and OS X both have the odd behavior. OpenBSD has the odd behavior, but with a caveat of sorts having to do with control messages. OpenBSD cvsweb annotate is down though, so I haven't found the reason for their change.

Yes, I agree it's odd, and I'm not sure I like it. I discovered the problem while writing edge-case regression tests for socket receive to better exercise soreceive_dgram, at first concluding it was a bug in soreceive_generic! My feeling, though, is that I should leave behavior "compatible" for 7.1, and perhaps we should change it for 7.2.

Robert N M Watson
Computer Laboratory
University of Cambridge
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/cvs-all
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to