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;
}

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to