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

From: Chris Friesen
Date: Thu Oct 07 2004 - 17:32:25 EST


David S. Miller wrote:
Chris Friesen <cfriesen@xxxxxxxxxxxxxxxxxx> wrote:

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().

Incorrect. When the user specifies blocking on the file descriptor
we must give it what it asked for. -EAGAIN on a blocking file descriptor
is always a bug, in all situations, that's what this code used to do and we
fixed it because it's a bug.

I believe you misread what I said. Just before the above quote, I said "We are discussing the case where the socket is nonblocking and the udp checksum is corrupt, right? "

What I had in mind was that the non-blocking file descriptor have select() return without verifying the checksum, and if it was discovered to be bad at recvmsg() time, we return EAGAIN. For a blocking file descriptor, we would verify the checksum before returning from select().

That way, the blocking case gets the semantics it expects (although worse performance), while the nonblocking case gets full performance as well as semantics that it will handle properly.

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/