Joseph Salisbury [off-list ref] writes:
On 02/05/2016 02:59 PM, Rainer Weikusat wrote:
[recvmsg w/o iovecs returning ENOTSUP for CMSG requests]
quoted
Funny little problem :-). The code using the interruptible lock cleared
err as side effect hence the
out:
return copied ? : err;
at the end of unix_stream_read_generic didn't return the -ENOTSUP put
into err at the start of the function if copied was zero after the loop
because the size of the passed data buffer was zero.
There are more problems wrt handling control-message only reads in this
code. In particular, changing the test program as follows:
if (fork() == 0) {
sleep(1);
send(socket_fd[client], msg, sizeof msg, MSG_DONTWAIT | MSG_NOSIGNAL);
_exit(0);
}
makes the recvmsg fail with EAGAIN and judging from the code (I didn't
test this yet), it will return without an error but also without
credentials if the
err = -EAGAIN
if (!timeo)
break;
is changed to
if (!timeo) {
err = -EAGAIN;
break
}
because the following
mutex_lock(&u->readlock);
continue;
will cause the
do {
} while (size)
loop condition to be evaluated and since size is 0 (AIUI), the loop will
terminate immediately.