Hi, with the attached test source, I get SIGLOST in recvfrom(). Basically what happens in recvfrom() is the following: - the __socket_recv() RPC returns a MACH_PORT_NULL 'addrport' - execution goes inside the "if (addr != NULL)" - the __socket_whatis_address() RPC fails because of the null port (I presume), so err is MACH_SEND_INVALID_DEST - the generic "if (err)" is followed, and then __hurd_sockfail() raises SIGLOST
The question is: is __socket_recv() supposed to actually return an addrport in this case, or should recvfrom() just being able to gracefully cope with this situation? On Linux the address length is set to 0 by recvfrom(), so I guess that this kind of sockets have no address? -- Pino Toscano
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
void die(int x, const char *s)
{
perror(s);
exit(x);
}
int main()
{
int ret;
int p[2];
char buf[2];
char namebuf[256];
socklen_t bufsize = sizeof(namebuf);
ret = socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, p);
if (ret) die(1, "socketpair");
ret = send(p[0], "xyz", 3, 0);
printf("> send: %d\n", ret);
if (ret < 0) die(2, "send");
ret = recvfrom(p[1], buf, sizeof(buf), 0, (struct sockaddr *)namebuf, &bufsize);
printf("> recvfrom: %d, %d\n", ret, bufsize);
if (ret < 0) die(3, "recvfrom");
close(p[0]);
close(p[1]);
return 0;
}
signature.asc
Description: This is a digitally signed message part.
