From 71d9f9f54b3c189ee6775bd0bcd4ac4e8266a9b9 Mon Sep 17 00:00:00 2001 From: jean-airoldie <25088801+jean-airoldie@users.noreply.github.com> Date: Mon, 30 Dec 2019 15:55:57 -0500 Subject: [PATCH] Fixed UB in setsockopt_option_scalar * Also whitelisted some clippy dead_code warnings. --- libzmq/src/core/sockopt.rs | 18 +++++++++++++----- libzmq/src/ctx.rs | 1 + libzmq/src/old.rs | 1 + libzmq/src/socket/gather.rs | 10 ++++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/libzmq/src/core/sockopt.rs b/libzmq/src/core/sockopt.rs index a85d9c3..73c01c4 100644 --- a/libzmq/src/core/sockopt.rs +++ b/libzmq/src/core/sockopt.rs @@ -16,6 +16,7 @@ use std::{ const MAX_OPTION_SIZE: size_t = 255; #[derive(Copy, Clone, Debug)] +#[allow(dead_code)] pub(crate) enum SocketOption { Backlog = sys::ZMQ_BACKLOG as isize, ConnectTimeout = sys::ZMQ_CONNECT_TIMEOUT as isize, @@ -262,11 +263,16 @@ where { let size = mem::size_of::() as size_t; - let value_ptr = match maybe { - Some(value) => &value as *const T as *const c_void, - None => &none_value as *const T as *const c_void, - }; - setsockopt(mut_sock_ptr, option, value_ptr, size) + match maybe { + Some(value) => { + let value_ptr = &value as *const T as *const c_void; + setsockopt(mut_sock_ptr, option, value_ptr, size) + } + None => { + let value_ptr = &none_value as *const T as *const c_void; + setsockopt(mut_sock_ptr, option, value_ptr, size) + } + } } pub(crate) fn setsockopt_bytes( @@ -311,6 +317,8 @@ pub(crate) fn setsockopt_option_duration( check_duration(duration)?; } + dbg!(option, maybe); + setsockopt_option_scalar( mut_sock_ptr, option, diff --git a/libzmq/src/ctx.rs b/libzmq/src/ctx.rs index d9905c2..69990e9 100644 --- a/libzmq/src/ctx.rs +++ b/libzmq/src/ctx.rs @@ -17,6 +17,7 @@ lazy_static! { } #[derive(Copy, Clone, Debug)] +#[allow(dead_code)] enum CtxOption { IOThreads, MaxSockets, diff --git a/libzmq/src/old.rs b/libzmq/src/old.rs index 1ff7313..d3b01ea 100644 --- a/libzmq/src/old.rs +++ b/libzmq/src/old.rs @@ -54,6 +54,7 @@ fn recv(mut_sock_ptr: *mut c_void, msg: &mut Msg) -> Result<(), Error> { } } +#[allow(dead_code)] pub(crate) enum OldSocketType { Router, Dealer, diff --git a/libzmq/src/socket/gather.rs b/libzmq/src/socket/gather.rs index 72105fd..000636c 100644 --- a/libzmq/src/socket/gather.rs +++ b/libzmq/src/socket/gather.rs @@ -314,6 +314,8 @@ mod test { use super::*; use crate::*; + use std::time::Duration; + #[test] fn test_ser_de() { let config = GatherConfig::new(); @@ -323,6 +325,14 @@ mod test { assert_eq!(config, de); } + #[test] + fn test_issue_125() { + let gather = Gather::new().unwrap(); + gather + .set_recv_timeout(Some(Duration::from_secs(3))) + .unwrap(); + } + #[test] fn test_gather() { let addr_a = InprocAddr::new_unique();