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

From: Martijn Sipkema
Date: Thu Oct 07 2004 - 17:51:50 EST



From: "Chris Friesen" <cfriesen@xxxxxxxxxxxxxxxxxx>
> 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.

Oh, I thought it was about the case where select() does not check the data and
a blocking socket is used and I would think EIO better in that case. But shouldn't
a nonblocking socket return EIO also, since the blocking socket would not in
fact block?

--ms

-
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/