Skip to content

Commit

Permalink
Merge pull request #482 from kevle/monitor-check_event-raii
Browse files Browse the repository at this point in the history
Fix for potential memory leak in monitor_t::check_event
  • Loading branch information
sigiesec committed Mar 10, 2021
2 parents 1a4ebda + 8d36a7c commit dc4c065
Showing 1 changed file with 7 additions and 15 deletions.
22 changes: 7 additions & 15 deletions zmq.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2309,8 +2309,7 @@ class monitor_t
{
assert(_monitor_socket);

zmq_msg_t eventMsg;
zmq_msg_init(&eventMsg);
zmq::message_t eventMsg;

zmq::pollitem_t items[] = {
{_monitor_socket.handle(), 0, ZMQ_POLLIN, 0},
Expand All @@ -2319,48 +2318,42 @@ class monitor_t
zmq::poll(&items[0], 1, timeout);

if (items[0].revents & ZMQ_POLLIN) {
int rc = zmq_msg_recv(&eventMsg, _monitor_socket.handle(), 0);
int rc = zmq_msg_recv(eventMsg.handle(), _monitor_socket.handle(), 0);
if (rc == -1 && zmq_errno() == ETERM)
return false;
assert(rc != -1);

} else {
zmq_msg_close(&eventMsg);
return false;
}

#if ZMQ_VERSION_MAJOR >= 4
const char *data = static_cast<const char *>(zmq_msg_data(&eventMsg));
const char *data = static_cast<const char *>(eventMsg.data());
zmq_event_t msgEvent;
memcpy(&msgEvent.event, data, sizeof(uint16_t));
data += sizeof(uint16_t);
memcpy(&msgEvent.value, data, sizeof(int32_t));
zmq_event_t *event = &msgEvent;
#else
zmq_event_t *event = static_cast<zmq_event_t *>(zmq_msg_data(&eventMsg));
zmq_event_t *event = static_cast<zmq_event_t *>(eventMsg.data());
#endif

#ifdef ZMQ_NEW_MONITOR_EVENT_LAYOUT
zmq_msg_t addrMsg;
zmq_msg_init(&addrMsg);
int rc = zmq_msg_recv(&addrMsg, _monitor_socket.handle(), 0);
zmq::message_t addrMsg;
int rc = zmq_msg_recv(addrMsg.handle(), _monitor_socket.handle(), 0);
if (rc == -1 && zmq_errno() == ETERM) {
zmq_msg_close(&eventMsg);
return false;
}

assert(rc != -1);
const char *str = static_cast<const char *>(zmq_msg_data(&addrMsg));
std::string address(str, str + zmq_msg_size(&addrMsg));
zmq_msg_close(&addrMsg);
std::string address = addrMsg.to_string();
#else
// Bit of a hack, but all events in the zmq_event_t union have the same layout so this will work for all event types.
std::string address = event->data.connected.addr;
#endif

#ifdef ZMQ_EVENT_MONITOR_STOPPED
if (event->event == ZMQ_EVENT_MONITOR_STOPPED) {
zmq_msg_close(&eventMsg);
return false;
}

Expand Down Expand Up @@ -2424,7 +2417,6 @@ class monitor_t
on_event_unknown(*event, address.c_str());
break;
}
zmq_msg_close(&eventMsg);

return true;
}
Expand Down

0 comments on commit dc4c065

Please sign in to comment.