From 22b2b9a2b6e1dd18d58ef51f453d2b4777e71be4 Mon Sep 17 00:00:00 2001 From: Dhammika Pathirana Date: Mon, 13 Dec 2010 14:18:47 +0100 Subject: fix overwriting errno on bind failure Signed-off-by: Dhammika Pathirana --- src/tcp_listener.cpp | 7 +++++-- src/tcp_listener.hpp | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp index 6d41069..22e9d4d 100644 --- a/src/tcp_listener.cpp +++ b/src/tcp_listener.cpp @@ -30,6 +30,7 @@ #ifdef ZMQ_HAVE_WINDOWS zmq::tcp_listener_t::tcp_listener_t () : + has_file (false), s (retired_fd) { memset (&addr, 0, sizeof (addr)); @@ -151,6 +152,7 @@ zmq::fd_t zmq::tcp_listener_t::accept () #endif zmq::tcp_listener_t::tcp_listener_t () : + has_file (false), s (retired_fd) { memset (&addr, 0, sizeof (addr)); @@ -236,11 +238,12 @@ int zmq::tcp_listener_t::set_address (const char *protocol_, const char *addr_, errno_assert (rc != -1); // Bind the socket to the file path. - rc = bind (s, (struct sockaddr*) &addr, sizeof (sockaddr_un)); + rc = bind (s, (struct sockaddr*) &addr, addr_len); if (rc != 0) { close (); return -1; } + has_file = true; // Listen for incomming connections. rc = listen (s, backlog_); @@ -270,7 +273,7 @@ int zmq::tcp_listener_t::close () // If there's an underlying UNIX domain socket, get rid of the file it // is associated with. struct sockaddr_un *su = (struct sockaddr_un*) &addr; - if (AF_UNIX == su->sun_family) { + if (AF_UNIX == su->sun_family && has_file) { rc = ::unlink(su->sun_path); if (rc != 0) return -1; diff --git a/src/tcp_listener.hpp b/src/tcp_listener.hpp index 1490a56..0e21dba 100644 --- a/src/tcp_listener.hpp +++ b/src/tcp_listener.hpp @@ -57,6 +57,9 @@ namespace zmq sockaddr_storage addr; socklen_t addr_len; + // True, if the undelying file for UNIX domain socket exists. + bool has_file; + // Underlying socket. fd_t s; -- cgit v1.2.3