Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Sep 2018 10:58:33 +0200
From:      Tamas Szakaly <sghctoma@gmail.com>
To:        freebsd-hackers@freebsd.org
Subject:   Attempting to receivce zero-length message with recvmsg
Message-ID:  <20180910085833.d4py4ladlyqchjvo@pamparam>

next in thread | raw e-mail | index | archive | help
Hi,

I have a question about the recvmsg syscall. According to POSIX, unless
O_NONBLOCK is set on the socket fd, recvmsg [1] should block until a message
arrives. However, recvmsg returns immediately with 0, if we are trying to
receive a 0-byte message from a SOCK_SEQPACKET AF_UNIX socket. Consider the
following code:

#include <stdio.h>
#include <sys/socket.h>

int main(int argc, char** argv) {
	int sock[2];
	socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sock);

	struct msghdr msghdr = {0};
	int ret = recvmsg(sock[1], &msghdr, 0);

	printf("ret=%d, msghdr.msg_flags=0x%08x\n\n", ret, msghdr.msg_flags);
}

Running this yields this output:

[0x00 socketstuff]$ cc socketpair.c -o socketpair && ./socketpair
ret=0, msghdr.msg_flags=0x00000000

You can see that recvmsg returns with 0, even though there were no messages
sent, and neither of the sockets are closed, so it should block indefinitely.

Is this behavior intentional to match the semantics of read [2] (i.e.
attempting to read zero bytes should be a no-op)?


[1] recvmsg: http://pubs.opengroup.org/onlinepubs/9699919799/functions/recvmsg.html
[2] read: http://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html

-- 
Tamas Szakaly
@sghctoma




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20180910085833.d4py4ladlyqchjvo>