Permalink
Browse files

Patch from Mato that fixes a subtle connect bug: EAGAIN was being use…

…d as a translation value for EINPROGRESS, thus

shadowing a real EAGAIN return value from the OS.  This caused later
assertions of "Invalid argument" in stream_engine.cpp when it attempted to
use a socket which was not connected.

I also add EINTR to mean EINPROGRESS, as per the POSIX and FreeBSD
documentation which specifies that a connect() call interrupted due to a
signal will complete asynchronously.

Signed-off-by: Martin Lucina <martin@lucina.net>
  • Loading branch information...
1 parent f497aae commit 1075005b500b86aa5ca828198bfedcd0067946fd @ianbarber ianbarber committed May 3, 2012
Showing with 13 additions and 5 deletions.
  1. +7 −0 src/ipc_connecter.cpp
  2. +6 −5 src/tcp_connecter.cpp
View
@@ -186,6 +186,13 @@ int zmq::ipc_connecter_t::open ()
// Connect was successfull immediately.
if (rc == 0)
return 0;
+
+ // Translate other error codes indicating asynchronous connect has been
+ // launched to a uniform EINPROGRESS.
+ if (rc == -1 && errno == EINTR) {
+ errno = EINPROGRESS;
+ return -1;
+ }
// Forward the error.
return -1;
View
@@ -140,7 +140,7 @@ void zmq::tcp_connecter_t::start_connecting ()
}
// Connection establishment may be delayed. Poll for its completion.
- else if (rc == -1 && errno == EAGAIN) {
+ else if (rc == -1 && errno == EINPROGRESS) {
handle = add_fd (s);
handle_valid = true;
set_pollout (handle);
@@ -211,17 +211,18 @@ int zmq::tcp_connecter_t::open ()
if (rc == 0)
return 0;
- // Asynchronous connect was launched.
+ // Translate other error codes indicating asynchronous connect has been
+ // launched to a uniform EINPROGRESS.
#ifdef ZMQ_HAVE_WINDOWS
if (rc == SOCKET_ERROR && (WSAGetLastError () == WSAEINPROGRESS ||
WSAGetLastError () == WSAEWOULDBLOCK)) {
- errno = EAGAIN;
+ errno = EINPROGRESS;
return -1;
}
wsa_error_to_errno ();
#else
- if (rc == -1 && errno == EINPROGRESS) {
- errno = EAGAIN;
+ if (rc == -1 && errno == EINTR) {
+ errno = EINPROGRESS;
return -1;
}
#endif

0 comments on commit 1075005

Please sign in to comment.