From 7fadd708a04e31e1edf23fdd3935961a141f4d32 Mon Sep 17 00:00:00 2001 From: Arthur O'Dwyer Date: Fri, 24 Aug 2012 16:42:31 -0700 Subject: [PATCH] Fix monitor_event() to work at all. There are three versions of monitor_event(), all taking variadic arguments. The original code just has the first one creating a va_list and passing that va_list variadically to the second one... which creates a new va_list and passes it variadically to the third one... and of course everything blows up when we try to pull a non-va_list argument off the stack. The correct approach matches the C standard library's use of printf/vprintf, scanf/vscanf, and so on. Once you make a va_list, you must pass it only to functions which expect a va_list parameter. --- src/ctx.cpp | 10 +++++++++- src/ctx.hpp | 3 ++- src/session_base.cpp | 7 ++++++- src/session_base.hpp | 2 ++ src/socket_base.cpp | 7 ++++++- src/socket_base.hpp | 2 ++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/ctx.cpp b/src/ctx.cpp index 52222779..7af45567 100644 --- a/src/ctx.cpp +++ b/src/ctx.cpp @@ -353,7 +353,15 @@ zmq::endpoint_t zmq::ctx_t::find_endpoint (const char *addr_) return endpoint; } -void zmq::ctx_t::monitor_event (zmq::socket_base_t *socket_, int event_, va_list args_) +void zmq::ctx_t::monitor_event (zmq::socket_base_t *socket_, int event_, ...) +{ + va_list args; + va_start (event_, args); + va_monitor_event (socket_, event_, args); + va_end (args); +} + +void zmq::ctx_t::va_monitor_event (zmq::socket_base_t *socket_, int event_, va_list args_) { if (monitor_fn != NULL) { zmq_event_data_t data; diff --git a/src/ctx.hpp b/src/ctx.hpp index ab5bf897..2aba8057 100644 --- a/src/ctx.hpp +++ b/src/ctx.hpp @@ -97,7 +97,8 @@ namespace zmq // Monitoring specific int monitor (zmq_monitor_fn *monitor_); - void monitor_event (zmq::socket_base_t *socket_, int event_, va_list args_); + void monitor_event (zmq::socket_base_t *socket_, int event_, ...); + void va_monitor_event (zmq::socket_base_t *socket_, int event_, va_list args_); enum { term_tid = 0, diff --git a/src/session_base.cpp b/src/session_base.cpp index 773f6b09..a9af8783 100644 --- a/src/session_base.cpp +++ b/src/session_base.cpp @@ -290,10 +290,15 @@ void zmq::session_base_t::monitor_event (int event_, ...) { va_list args; va_start (args, event_); - socket->monitor_event (event_, args); + va_monitor_event (event_, args); va_end (args); } +void zmq::session_base_t::va_monitor_event (int event_, va_list args) +{ + socket->va_monitor_event (event_, args); +} + void zmq::session_base_t::process_plug () { if (connect) diff --git a/src/session_base.hpp b/src/session_base.hpp index f8bb6c5a..7d26ad89 100644 --- a/src/session_base.hpp +++ b/src/session_base.hpp @@ -24,6 +24,7 @@ #define __ZMQ_SESSION_BASE_HPP_INCLUDED__ #include +#include #include "own.hpp" #include "io_object.hpp" @@ -67,6 +68,7 @@ namespace zmq void terminated (zmq::pipe_t *pipe_); void monitor_event (int event_, ...); + void va_monitor_event (int event_, va_list args); protected: diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 73083276..bb7c3628 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -1001,6 +1001,11 @@ void zmq::socket_base_t::monitor_event (int event_, ...) { va_list args; va_start (args, event_); - get_ctx ()->monitor_event (this, event_, args); + va_monitor_event(event, args); va_end (args); } + +void zmq::socket_base_t::monitor_event (int event_, va_list args) +{ + get_ctx ()->va_monitor_event (this, event_, args); +} diff --git a/src/socket_base.hpp b/src/socket_base.hpp index ab630e35..2dabd1e0 100644 --- a/src/socket_base.hpp +++ b/src/socket_base.hpp @@ -25,6 +25,7 @@ #include #include +#include #include "own.hpp" #include "array.hpp" @@ -102,6 +103,7 @@ namespace zmq void unlock(); void monitor_event (int event_, ...); + void va_monitor_event (int event_, va_list args); protected: