From a9ca06847b2d55c6b1272e8df68ab032f6b8a762 Mon Sep 17 00:00:00 2001 From: Rik van der Heijden Date: Sat, 1 Aug 2015 10:28:57 +0200 Subject: [PATCH] Fix issue #52, reset all bits in getsockopt --- Makefile.am | 4 ++ NEWS | 2 + src/socket_base.cpp | 1 + tests/CMakeLists.txt | 1 + tests/test_getsockopt_memset.cpp | 69 ++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+) create mode 100644 tests/test_getsockopt_memset.cpp diff --git a/Makefile.am b/Makefile.am index 064edc24..1e7ae549 100644 --- a/Makefile.am +++ b/Makefile.am @@ -324,6 +324,7 @@ test_apps = \ test_proxy \ test_proxy_single_socket \ test_proxy_terminate \ + test_getsockopt_memset \ test_many_sockets \ test_ipc_wildcard \ test_diffserv \ @@ -482,6 +483,9 @@ test_proxy_single_socket_LDADD = libzmq.la test_proxy_terminate_SOURCES = tests/test_proxy_terminate.cpp test_proxy_terminate_LDADD = libzmq.la +test_getsockopt_memset_SOURCES = tests/test_getsockopt_memset.cpp +test_getsockopt_memset_LDADD = libzmq.la + test_many_sockets_SOURCES = tests/test_many_sockets.cpp test_many_sockets_LDADD = libzmq.la diff --git a/NEWS b/NEWS index 09f4882d..6c1f0f78 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ 0MQ version 4.1.3 stable, released on 2015/xx/xx ================================================ +* Fixed #52 - getsockopt ZMQ_RCVMORE now resets all bits instead of only 32 + * Fixed validation of IPv6 addresses with brackets 0MQ version 4.1.2 stable, released on 2015/06/15 diff --git a/src/socket_base.cpp b/src/socket_base.cpp index f79af6ff..6263d83b 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -304,6 +304,7 @@ int zmq::socket_base_t::getsockopt (int option_, void *optval_, errno = EINVAL; return -1; } + memset(optval_, 0, *optvallen_); *((int*) optval_) = rcvmore ? 1 : 0; *optvallen_ = sizeof (int); return 0; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8547fd1b..9655f783 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -56,6 +56,7 @@ if(NOT WIN32) test_proxy test_proxy_single_socket test_proxy_terminate + test_getsockopt_memset test_filter_ipc ) if(HAVE_FORK) diff --git a/tests/test_getsockopt_memset.cpp b/tests/test_getsockopt_memset.cpp new file mode 100644 index 00000000..e81ae55b --- /dev/null +++ b/tests/test_getsockopt_memset.cpp @@ -0,0 +1,69 @@ +/* + Copyright (c) 2007-2015 Contributors as noted in the AUTHORS file + + This file is part of libzmq, the ZeroMQ core engine in C++. + + libzmq is free software; you can redistribute it and/or modify it under + the terms of the GNU Lesser General Public License (LGPL) as published + by the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + As a special exception, the Contributors give you permission to link + this library with independent modules to produce an executable, + regardless of the license terms of these independent modules, and to + copy and distribute the resulting executable under terms of your choice, + provided that you also meet, for each linked independent module, the + terms and conditions of the license of that module. An independent + module is a module which is not derived from or based on this library. + If you modify this library, you must extend this exception to your + version of the library. + + libzmq is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . +*/ + +#include "testutil.hpp" + +int main (void) +{ + int64_t more; + size_t more_size = sizeof(more); + + setup_test_environment(); + void *ctx = zmq_ctx_new (); + assert (ctx); + + void *sb = zmq_socket (ctx, ZMQ_PUB); + assert (sb); + int rc = zmq_bind (sb, "inproc://a"); + assert (rc == 0); + + void *sc = zmq_socket (ctx, ZMQ_SUB); + assert (sc); + rc = zmq_connect (sc, "inproc://a"); + assert (rc == 0); + + memset(&more, 0xFF, sizeof(int64_t)); + zmq_getsockopt(sc, ZMQ_RCVMORE, &more, &more_size); + assert (more_size == sizeof(int)); + assert (more == 0); + + + // Cleanup + + rc = zmq_close (sc); + assert (rc == 0); + + rc = zmq_close (sb); + assert (rc == 0); + + rc = zmq_ctx_term (ctx); + assert (rc == 0); + + return 0 ; +}