diff options
author | Martin Lucina <martin@lucina.net> | 2012-05-04 14:34:18 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2012-05-04 14:34:18 +0200 |
commit | 5bba016135cdc13e0f5b537807c516d5f1089d1b (patch) | |
tree | a93947a67f7bf5708e531953fbd68c9340a217bc /src | |
parent | 357a20ef6feae94c033eed392b025e57fe8eaa81 (diff) |
Correct handling of connect() errors in tcp, ipc_connecter_t
EAGAIN was being used 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>
Diffstat (limited to 'src')
-rw-r--r-- | src/ipc_connecter.cpp | 9 | ||||
-rw-r--r-- | src/tcp_connecter.cpp | 11 |
2 files changed, 11 insertions, 9 deletions
diff --git a/src/ipc_connecter.cpp b/src/ipc_connecter.cpp index af3665c..0722532 100644 --- a/src/ipc_connecter.cpp +++ b/src/ipc_connecter.cpp @@ -133,7 +133,7 @@ void xs::ipc_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) { xs_assert (!handle); handle = add_fd (s); set_pollout (handle); @@ -196,9 +196,10 @@ int xs::ipc_connecter_t::open () if (rc == 0) return 0; - // Asynchronous connect was launched. - if (rc == -1 && errno == EINPROGRESS) { - errno = EAGAIN; + // Translate other error codes indicating asynchronous connect has been + // launched to a uniform EINPROGRESS. + if (rc == -1 && errno == EINTR) { + errno = EINPROGRESS; return -1; } diff --git a/src/tcp_connecter.cpp b/src/tcp_connecter.cpp index de105bb..5ae01e7 100644 --- a/src/tcp_connecter.cpp +++ b/src/tcp_connecter.cpp @@ -140,7 +140,7 @@ void xs::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) { xs_assert (!handle); handle = add_fd (s); set_pollout (handle); @@ -236,17 +236,18 @@ int xs::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 XS_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 |