From a772bcc6ebe198f939889abbda18eded2a326941 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Mon, 2 Jul 2018 12:44:42 -0700 Subject: fixes #564 Race regression caused by#522 fixes #565 Option getting should validate sizes more aggressively fixes #563 Reconnect timeouts should be settable on dialers fixes #562 pipe test is fragile --- src/core/socket.c | 73 +++++++++++++++---------------------------------------- 1 file changed, 20 insertions(+), 53 deletions(-) (limited to 'src/core/socket.c') diff --git a/src/core/socket.c b/src/core/socket.c index 894e4fee..4d7bbbc1 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -181,30 +181,6 @@ sock_get_sendtimeo(nni_sock *s, void *buf, size_t *szp, nni_opt_type t) return (nni_copyout_ms(s->s_sndtimeo, buf, szp, t)); } -static int -sock_set_reconnmint(nni_sock *s, const void *buf, size_t sz, nni_opt_type t) -{ - return (nni_copyin_ms(&s->s_reconn, buf, sz, t)); -} - -static int -sock_get_reconnmint(nni_sock *s, void *buf, size_t *szp, nni_opt_type t) -{ - return (nni_copyout_ms(s->s_reconn, buf, szp, t)); -} - -static int -sock_set_reconnmaxt(nni_sock *s, const void *buf, size_t sz, nni_opt_type t) -{ - return (nni_copyin_ms(&s->s_reconnmax, buf, sz, t)); -} - -static int -sock_get_reconnmaxt(nni_sock *s, void *buf, size_t *szp, nni_opt_type t) -{ - return (nni_copyout_ms(s->s_reconnmax, buf, szp, t)); -} - static int sock_set_recvbuf(nni_sock *s, const void *buf, size_t sz, nni_opt_type t) { @@ -316,18 +292,6 @@ static const sock_option sock_options[] = { .o_get = sock_get_sendbuf, .o_set = sock_set_sendbuf, }, - { - .o_name = NNG_OPT_RECONNMINT, - .o_type = NNI_TYPE_DURATION, - .o_get = sock_get_reconnmint, - .o_set = sock_set_reconnmint, - }, - { - .o_name = NNG_OPT_RECONNMAXT, - .o_type = NNI_TYPE_DURATION, - .o_get = sock_get_reconnmaxt, - .o_set = sock_set_reconnmaxt, - }, { .o_name = NNG_OPT_SOCKNAME, .o_type = NNI_TYPE_STRING, @@ -914,16 +878,6 @@ nni_sock_proto_data(nni_sock *sock) return (sock->s_data); } -void -nni_sock_reconntimes(nni_sock *sock, nni_duration *rcur, nni_duration *rmax) -{ - // These two values are linked, so get them atomically. - nni_mtx_lock(&sock->s_mx); - *rcur = sock->s_reconn; - *rmax = sock->s_reconnmax ? sock->s_reconnmax : sock->s_reconn; - nni_mtx_unlock(&sock->s_mx); -} - int nni_sock_add_listener(nni_sock *s, nni_listener *l) { @@ -1036,8 +990,7 @@ nni_sock_setopt( return (rv); } - // Some options do not go down to transports. Handle them - // directly. + // Some options do not go down to transports. Handle them directly. for (sso = sock_options; sso->o_name != NULL; sso++) { if (strcmp(sso->o_name, name) != 0) { continue; @@ -1058,10 +1011,16 @@ nni_sock_setopt( return (rv); } - // Validation of transport options. This is stateless, so + // Validation of generic and transport options. This is stateless, so // transports should not fail to set an option later if they // passed it here. - if ((rv = nni_tran_chkopt(name, v, sz, t)) != 0) { + if ((strcmp(name, NNG_OPT_RECONNMINT) == 0) || + (strcmp(name, NNG_OPT_RECONNMAXT) == 0)) { + nng_duration ms; + if ((rv = nni_copyin_ms(&ms, v, sz, t)) != 0) { + return (rv); + } + } else if ((rv = nni_tran_chkopt(name, v, sz, t)) != 0) { return (rv); } @@ -1194,10 +1153,18 @@ nni_sock_getopt( size_t sz = sopt->sz; if ((sopt->typ != NNI_TYPE_OPAQUE) && - (t != NNI_TYPE_OPAQUE) && (t != sopt->typ)) { - nni_mtx_unlock(&s->s_mx); - return (NNG_EBADTYPE); + (t != sopt->typ)) { + + if (t != NNI_TYPE_OPAQUE) { + nni_mtx_unlock(&s->s_mx); + return (NNG_EBADTYPE); + } + if (*szp != sopt->sz) { + nni_mtx_unlock(&s->s_mx); + return (NNG_EINVAL); + } } + if (sopt->sz > *szp) { sz = *szp; } -- cgit v1.2.3-70-g09d2