From 4631fde7e385ea31e85f41290614afb9bda391c9 Mon Sep 17 00:00:00 2001
From: Martin Sustrik <sustrik@fastmq.commkdir>
Date: Wed, 16 Sep 2009 14:02:43 +0200
Subject: ZMQII-8: Failure during orphan pipe deallocation

---
 src/dispatcher.cpp         | 4 ++--
 src/session.cpp            | 6 +++++-
 src/zmq_connecter_init.cpp | 6 +++++-
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/dispatcher.cpp b/src/dispatcher.cpp
index 530238d..6ac9fa2 100644
--- a/src/dispatcher.cpp
+++ b/src/dispatcher.cpp
@@ -100,8 +100,8 @@ zmq::dispatcher_t::~dispatcher_t ()
         delete io_threads [i];
 
     //  Deallocate all the orphaned pipes.
-    for (pipes_t::iterator it = pipes.begin (); it != pipes.end (); it++)
-        delete *it;
+    while (!pipes.empty ())
+        delete *pipes.begin ();
 
     delete [] command_pipes;
 
diff --git a/src/session.cpp b/src/session.cpp
index 9593827..d455462 100644
--- a/src/session.cpp
+++ b/src/session.cpp
@@ -55,6 +55,9 @@ bool zmq::session_t::read (::zmq_msg_t *msg_)
 
 bool zmq::session_t::write (::zmq_msg_t *msg_)
 {
+    if (!out_pipe)
+        return true;
+
     if (out_pipe->write (msg_)) {
         zmq_msg_init (msg_);
         return true;
@@ -65,7 +68,8 @@ bool zmq::session_t::write (::zmq_msg_t *msg_)
 
 void zmq::session_t::flush ()
 {
-    out_pipe->flush ();
+    if (out_pipe)
+        out_pipe->flush ();
 }
 
 void zmq::session_t::detach ()
diff --git a/src/zmq_connecter_init.cpp b/src/zmq_connecter_init.cpp
index ffd4a64..f0cbf90 100644
--- a/src/zmq_connecter_init.cpp
+++ b/src/zmq_connecter_init.cpp
@@ -60,9 +60,13 @@ bool zmq::zmq_connecter_init_t::read (::zmq_msg_t *msg_)
     if (!session_name.empty ())
         session = owner->find_session (session_name.c_str ());
     if (!session) {
-        //  TODO
+
+        //  TODO:
+        //  The socket is already closing. The session is already shut down,
+        //  so no point in continuing with connecting. Shut the connection down.
         zmq_assert (false);
     }
+
     send_attach (session, engine);
     engine = NULL;
 
-- 
cgit v1.2.3