From 18791f2bfbd925ad6689c624dc0e18fae919c7c8 Mon Sep 17 00:00:00 2001 From: Brian Silverman Date: Tue, 21 Jul 2015 19:42:20 -0700 Subject: [PATCH] Fix several missing msg_t::close calls. I traced memory leaks found using AddressSanitizer down to these. --- src/stream.cpp | 2 ++ tests/test_client_server.cpp | 5 +++++ tests/test_srcfd.cpp | 3 +++ tests/test_stream_disconnect.cpp | 8 ++++++++ 4 files changed, 18 insertions(+) diff --git a/src/stream.cpp b/src/stream.cpp index 6ed9dd77..e8ce1b09 100644 --- a/src/stream.cpp +++ b/src/stream.cpp @@ -229,6 +229,8 @@ int zmq::stream_t::xrecv (msg_t *msg_) // Rather than sendig this frame, we keep it in prefetched // buffer and send a frame with peer's ID. blob_t identity = pipe->get_identity (); + rc = msg_->close(); + errno_assert (rc == 0); rc = msg_->init_size (identity.size ()); errno_assert (rc == 0); diff --git a/tests/test_client_server.cpp b/tests/test_client_server.cpp index 8793eeac..155232ea 100644 --- a/tests/test_client_server.cpp +++ b/tests/test_client_server.cpp @@ -56,6 +56,8 @@ int main (void) rc = zmq_msg_send(&msg, client, 0); assert (rc == 1); + rc = zmq_msg_init(&msg); + assert (rc == 0); rc = zmq_msg_recv(&msg, server, 0); assert (rc == 1); @@ -80,6 +82,9 @@ int main (void) rc = zmq_msg_recv(&msg, client, 0); assert (rc == 1); + rc = zmq_msg_close(&msg); + assert (rc == 0); + rc = zmq_close (server); assert (rc == 0); diff --git a/tests/test_srcfd.cpp b/tests/test_srcfd.cpp index 04d03691..faf2f2f8 100644 --- a/tests/test_srcfd.cpp +++ b/tests/test_srcfd.cpp @@ -75,6 +75,9 @@ int main (void) int srcFd = zmq_msg_get(&msg, ZMQ_SRCFD); assert(srcFd >= 0); + rc = zmq_msg_close(&msg); + assert (rc == 0); + // get the remote endpoint struct sockaddr_storage ss; #ifdef ZMQ_HAVE_HPUX diff --git a/tests/test_stream_disconnect.cpp b/tests/test_stream_disconnect.cpp index 7d354a00..0c56328f 100644 --- a/tests/test_stream_disconnect.cpp +++ b/tests/test_stream_disconnect.cpp @@ -91,6 +91,8 @@ int main(int, char**) assert (rc != -1); assert(zmq_msg_size (&peer_frame) > 0); assert (has_more (sockets [SERVER])); + rc = zmq_msg_close (&peer_frame); + assert (rc == 0); // Server: Grab the 2nd frame (actual payload). zmq_msg_t data_frame; @@ -99,6 +101,8 @@ int main(int, char**) rc = zmq_msg_recv (&data_frame, sockets [SERVER], 0); assert (rc != -1); assert(zmq_msg_size (&data_frame) == 0); + rc = zmq_msg_close (&data_frame); + assert (rc == 0); // Client: Grab the 1st frame (peer identity). rc = zmq_msg_init (&peer_frame); @@ -107,6 +111,8 @@ int main(int, char**) assert (rc != -1); assert(zmq_msg_size (&peer_frame) > 0); assert (has_more (sockets [CLIENT])); + rc = zmq_msg_close (&peer_frame); + assert (rc == 0); // Client: Grab the 2nd frame (actual payload). rc = zmq_msg_init (&data_frame); @@ -114,6 +120,8 @@ int main(int, char**) rc = zmq_msg_recv (&data_frame, sockets [CLIENT], 0); assert (rc != -1); assert(zmq_msg_size (&data_frame) == 0); + rc = zmq_msg_close (&data_frame); + assert (rc == 0); // Send initial message. char blob_data [256];