[zeromq-dev] (Fwd) [crossroads-dev] [PATCH] Correct handling of connect() errors in tcp, ipc_connecter_t
Martin Lucina
martin at lucina.net
Thu May 3 13:46:38 CEST 2012
Hi,
FYI, the patch below is for an old bug, also affects ZeroMQ 3.1.0 and
2.1.11 (based on the last released versions I have local copies of, I can't
seem to access GH from here).
-mato
----- Forwarded message from Martin Lucina <martin at lucina.net> -----
Date: Thu, 3 May 2012 13:08:49 +0200
From: Martin Lucina <martin at lucina.net>
To: crossroads-dev at groups.crossroads.io
Cc: Martin Lucina <martin at lucina.net>
Subject: [crossroads-dev] [PATCH] 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 at lucina.net>
---
src/ipc_connecter.cpp | 9 +++++----
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
--
1.7.10
-----------------------------------------
Full text of this topic in Crossroads Development:
http://groups.crossroads.io/r/topic/2QCfCK2pongMdlQQIzGubl
To leave Crossroads Development, email
mailto:crossroads-dev at groups.crossroads.io?Subject=unsubscribe
Start your own free groups and site with
OnlineGroups.Net http://onlinegroups.net
Host your own online groups site with
GroupServer http://groupserver.org
----- End forwarded message -----
--
Martin Lucina
http://lucina.net/ (interwebs/blogs/rants/consulting)
martin at lucina.net (smtp/xmpp/jabber/gtalk)
@matolucina (twitter)
More information about the zeromq-dev
mailing list