From 3348cd74075bf593ab8484d9ad915699d4b9c9fc Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Thu, 21 Feb 2013 23:11:40 +0100 Subject: [PATCH] unix: handle EINPROGRESS for unix sockets Before this commit, it was assumed that connect() on UNIX sockets never returns EINPROGRESS. It turned out to be a bad assumption: Dave Pacheco reports sporadic hangups on SmartOS because of that. It's not clear to me _why_ the Illumos kernel returns that error but that's inconsequential: whatever the cause, libuv needs to handle it and now it does. Fixes joyent/node#4785. --- src/unix/pipe.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/unix/pipe.c b/src/unix/pipe.c index b28c8ef9..1185b91a 100644 --- a/src/unix/pipe.c +++ b/src/unix/pipe.c @@ -183,9 +183,6 @@ void uv_pipe_connect(uv_connect_t* req, uv_strlcpy(saddr.sun_path, name, sizeof(saddr.sun_path)); saddr.sun_family = AF_UNIX; - /* We don't check for EINPROGRESS. Think about it: the socket - * is either there or not. - */ do { r = connect(uv__stream_fd(handle), (struct sockaddr*)&saddr, sizeof saddr); @@ -193,7 +190,8 @@ void uv_pipe_connect(uv_connect_t* req, while (r == -1 && errno == EINTR); if (r == -1) - goto out; + if (errno != EINPROGRESS) + goto out; if (new_sock) if (uv__stream_open((uv_stream_t*)handle, @@ -213,8 +211,9 @@ out: req->cb = cb; ngx_queue_init(&req->queue); - /* Run callback on next tick. */ - uv__io_feed(handle->loop, &handle->io_watcher); + /* Force callback to run on next tick in case of error. */ + if (err != 0) + uv__io_feed(handle->loop, &handle->io_watcher); /* Mimic the Windows pipe implementation, always * return 0 and let the callback handle errors.