Commit 336f7272 authored by Ian Barber's avatar Ian Barber

The previous code to block the socket from receiving on that pipe during a…

The previous code to block the socket from receiving on that pipe during a disconnect was vulnerable to a race condition. This code calls with the terminate functions of both ends of the pipe - I believe this should be safer. This required storing a pointer to the socket end of the pipe
parent 5008f385
......@@ -308,6 +308,9 @@ void zmq::session_base_t::process_attach (i_engine *engine_)
// Ask socket to plug into the remote end of the pipe.
send_bind (socket, pipes [1]);
// Store the outpipe for disconnect situations
outpipe = pipes [1];
}
// Plug in the engine.
......@@ -411,8 +414,7 @@ void zmq::session_base_t::detached ()
if (pipe && options.delay_attach_on_connect == 1
&& addr->protocol != "pgm" && addr->protocol != "epgm") {
pipe->terminate (false);
socket->terminated (pipe);
pipe = NULL;
outpipe->terminate (false);
}
}
......
......@@ -103,6 +103,9 @@ namespace zmq
// Pipe connecting the session to its socket.
zmq::pipe_t *pipe;
// Socket end of the pipe, for delay attach scenario
zmq::pipe_t *outpipe;
// This flag is true if the remainder of the message being processed
// is still in the in pipe.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment