On Mon, Feb 19, 2007 at 06:13:27PM +0000, Mark McLoughlin wrote: > On Fri, 2007-02-16 at 19:28 +0000, Daniel P. Berrange wrote: > > On Fri, Feb 16, 2007 at 02:44:57PM +0000, Mark McLoughlin wrote: > > > > @@ -1226,6 +1332,7 @@ static int qemudDispatchPoll(struct qemu > > > > > > while (sock) { > > > struct qemud_socket *next = sock->next; > > > + /* FIXME: the daemon shouldn't exit on error here */ > > > if (fds[fd].revents) > > > if (qemudDispatchServer(server, sock) < 0) > > > return -1; > > > > Yes & no. There are two reasons why qemuDispatchServer can fail. Either > > it can fail to set CLOSEXEC/NONBLOCK mode on the client socket, in > > which case we could simply drop the client & continue without exiting. > > If the accept() call fails for anything other than EAGAIN/EINTR then > > we arguably should exit, because something serious has gone wrong. > > Doesn't accept() fail if the client fails to send the final ACK? Do we > want the daemon to die in that case? Think of an unprivileged user > connecting to the system daemon's readonly socket ... you really want to > be paranoid about the daemon exiting as it creates the opportunity for > unprivileged users to take down guests and networks. Yes, accept will fail if the client doesn't complete the handshake. I already (tried) to take care of that case though by not returning an error code if the errno is EAGAIN if ((fd = accept(sock->fd, (struct sockaddr *)&addr, &addrlen)) < 0) { if (errno == EAGAIN) return 0; qemudLog(QEMUD_ERR, "Failed to accept connection: %s", strerror(errno)); return -1; } Looking at the man page, i think I also need to check for ECONNABORTED errno value too. Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|