Re: UDP recvmsg blocks after select(), 2.6 bug?

From: Chris Friesen
Date: Thu Oct 07 2004 - 17:01:54 EST


Martijn Sipkema wrote:
From: "Chris Friesen" <cfriesen@xxxxxxxxxxxxxxxxxx>

Since we wouldn't be posix compliant anyway in the nonblocking case, we may as well return EAGAIN--it's the most appropriate.


No, I don't think so, since POSIX says to return EAGAIN when:

The socket's file descriptor is marked O_NONBLOCK and no data is waiting to
be received; or MSG_OOB is set and no out-of-band data is available and either
the socket's file descriptor is marked O_NONBLOCK or the socket does not
support blocking to await out-of-band data

We are discussing the case where the socket is nonblocking and the udp checksum is corrupt, right? (Because in the blocking case select() would verify the checksum.)

In this case, select() returns with the socket readable, we call recvmsg() and discover the message is corrupt. At this point we throw away the corrupt message, so we now have no data waiting to be received. We return EAGAIN, and userspace goes merrily on its way, handling anything else in its loop, then going back to select().

Seems perfectly suitable.

Chris
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/