From 8249242a9325a27e57107d78bfa168e918cc4f7a Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Sun, 3 Nov 2024 08:29:55 -0800 Subject: Remove untyped nng_pipe_get, support for untyped sockaddr set. This is a step on the path to removing unsafe untyped option accesses. --- src/core/options.c | 20 +++---------------- src/core/options.h | 2 +- src/nng.c | 6 ------ src/platform/posix/posix_tcpdial.c | 3 ++- src/platform/windows/win_tcpdial.c | 3 ++- src/sp/transport/ipc/ipc_test.c | 7 +++---- src/sp/transport/zerotier/zerotier.c | 3 ++- src/supplemental/websocket/websocket_test.c | 5 +---- tests/ipc.c | 6 +----- tests/tcp.c | 11 +++------- tests/tcp6.c | 9 ++------- tests/tcpsupp.c | 7 ++----- tests/ws.c | 30 +++------------------------- tests/wss.c | 31 ++++++----------------------- 14 files changed, 31 insertions(+), 112 deletions(-) diff --git a/src/core/options.c b/src/core/options.c index 5de87c61..ff794168 100644 --- a/src/core/options.c +++ b/src/core/options.c @@ -204,26 +204,12 @@ nni_copyin_u64(uint64_t *up, const void *v, size_t sz, nni_type t) } int -nni_copyin_sockaddr(nng_sockaddr *ap, const void *v, size_t sz, nni_type t) +nni_copyin_sockaddr(nng_sockaddr *ap, const void *v, nni_type t) { - nng_sockaddr a; - - switch (t) { - case NNI_TYPE_SOCKADDR: - a = *(nng_sockaddr *) v; - break; - case NNI_TYPE_OPAQUE: - if (sz != sizeof(nng_sockaddr)) { - return (NNG_EINVAL); - } - memcpy(&a, v, sz); - break; - default: + if (t != NNI_TYPE_SOCKADDR) { return (NNG_EBADTYPE); } - if (ap != NULL) { - *ap = a; - } + *ap = *(nng_sockaddr *) v; return (0); } diff --git a/src/core/options.h b/src/core/options.h index aff429df..67481d9f 100644 --- a/src/core/options.h +++ b/src/core/options.h @@ -34,7 +34,7 @@ extern int nni_copyin_size( extern int nni_copyin_str(char *, const void *, size_t, size_t, nni_type); extern int nni_copyin_ptr(void **, const void *, size_t, nni_type); extern int nni_copyin_u64(uint64_t *, const void *, size_t, nni_type); -extern int nni_copyin_sockaddr(nng_sockaddr *, const void *, size_t, nni_type); +extern int nni_copyin_sockaddr(nng_sockaddr *, const void *, nni_type); // nni_copyout_xxx copies out a type of the named value. It assumes that // the type is aligned and the size correct, unless NNI_TYPE_OPAQUE is passed. diff --git a/src/nng.c b/src/nng.c index 08606715..8fafe364 100644 --- a/src/nng.c +++ b/src/nng.c @@ -1383,12 +1383,6 @@ pipe_get(nng_pipe p, const char *name, void *val, size_t *szp, nni_type t) return (rv); } -int -nng_pipe_get(nng_pipe id, const char *n, void *v, size_t *szp) -{ - return (pipe_get(id, n, v, szp, NNI_TYPE_OPAQUE)); -} - int nng_pipe_get_int(nng_pipe id, const char *n, int *v) { diff --git a/src/platform/posix/posix_tcpdial.c b/src/platform/posix/posix_tcpdial.c index 6aea8ae5..3f0b0768 100644 --- a/src/platform/posix/posix_tcpdial.c +++ b/src/platform/posix/posix_tcpdial.c @@ -347,8 +347,9 @@ tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t) #ifdef NNG_ENABLE_IPV6 struct sockaddr_in6 *sin6; #endif + NNI_ARG_UNUSED(sz); - if ((rv = nni_copyin_sockaddr(&sa, buf, sz, t)) != 0) { + if ((rv = nni_copyin_sockaddr(&sa, buf, t)) != 0) { return (rv); } if ((len = nni_posix_nn2sockaddr(&ss, &sa)) == 0) { diff --git a/src/platform/windows/win_tcpdial.c b/src/platform/windows/win_tcpdial.c index dbdd0762..5492d265 100644 --- a/src/platform/windows/win_tcpdial.c +++ b/src/platform/windows/win_tcpdial.c @@ -342,8 +342,9 @@ tcp_dialer_set_locaddr(void *arg, const void *buf, size_t sz, nni_type t) #ifdef NNG_ENABLE_IPV6 struct sockaddr_in6 *sin6; #endif + NNI_ARG_UNUSED(sz); - if ((rv = nni_copyin_sockaddr(&sa, buf, sz, t)) != 0) { + if ((rv = nni_copyin_sockaddr(&sa, buf, t)) != 0) { return (rv); } if ((sslen = nni_win_nn2sockaddr(&ss, &sa)) == 0) { diff --git a/src/sp/transport/ipc/ipc_test.c b/src/sp/transport/ipc/ipc_test.c index 473246fe..d6c4e3d8 100644 --- a/src/sp/transport/ipc/ipc_test.c +++ b/src/sp/transport/ipc/ipc_test.c @@ -67,8 +67,7 @@ test_ipc_dialer_properties(void) // Dialers don't have local addresses. NUTS_FAIL(nng_dialer_get_addr(d, NNG_OPT_LOCADDR, &sa), NNG_ENOTSUP); - NUTS_FAIL( - nng_dialer_set(d, NNG_OPT_LOCADDR, &sa, sizeof(sa)), NNG_ENOTSUP); + NUTS_FAIL(nng_dialer_set_addr(d, NNG_OPT_LOCADDR, &sa), NNG_ENOTSUP); z = 8192; NUTS_PASS(nng_dialer_set_size(d, NNG_OPT_RECVMAXSZ, z)); @@ -133,8 +132,8 @@ test_ipc_listener_properties(void) NUTS_TRUE(sa.s_ipc.sa_family == NNG_AF_IPC); NUTS_MATCH(sa.s_ipc.sa_path, addr + strlen("ipc://")); - NUTS_FAIL(nng_listener_set(l, NNG_OPT_LOCADDR, &sa, sizeof(sa)), - NNG_EREADONLY); + NUTS_FAIL( + nng_listener_set_addr(l, NNG_OPT_LOCADDR, &sa), NNG_EREADONLY); z = 8192; NUTS_PASS(nng_listener_set_size(l, NNG_OPT_RECVMAXSZ, z)); z = 0; diff --git a/src/sp/transport/zerotier/zerotier.c b/src/sp/transport/zerotier/zerotier.c index 295dda5d..b3e931ef 100644 --- a/src/sp/transport/zerotier/zerotier.c +++ b/src/sp/transport/zerotier/zerotier.c @@ -2745,8 +2745,9 @@ zt_ep_set_add_local_addr(void *arg, const void *data, size_t sz, nni_type t) nng_sockaddr sa; zt_ep *ep = arg; int rv; + NNI_ARG_UNUSED(sz); - if ((rv = nni_copyin_sockaddr(&sa, data, sz, t)) == 0) { + if ((rv = nni_copyin_sockaddr(&sa, data, t)) == 0) { enum ZT_ResultCode zrv; zt_node *ztn; struct sockaddr_storage ss; diff --git a/src/supplemental/websocket/websocket_test.c b/src/supplemental/websocket/websocket_test.c index 1b48aff5..d784c1bc 100644 --- a/src/supplemental/websocket/websocket_test.c +++ b/src/supplemental/websocket/websocket_test.c @@ -20,7 +20,6 @@ test_websocket_wildcard(void) nng_stream_listener *l = NULL; nng_sockaddr sa1; nng_sockaddr sa2; - size_t sz; nng_aio *daio = NULL; nng_aio *laio = NULL; nng_aio *aio1 = NULL; @@ -38,9 +37,7 @@ test_websocket_wildcard(void) // Let's get the address we're going to use to dial -- also check // that it is correct. - sz = sizeof(sa1); - NUTS_PASS(nng_stream_listener_get(l, NNG_OPT_LOCADDR, &sa1, &sz)); - NUTS_TRUE(sz == sizeof(sa1)); + NUTS_PASS(nng_stream_listener_get_addr(l, NNG_OPT_LOCADDR, &sa1)); NUTS_TRUE(sa1.s_in.sa_port != 0); NUTS_TRUE(sa1.s_family == NNG_AF_INET); NUTS_TRUE(nuts_be32(sa1.s_in.sa_addr) == 0x7F000001u); diff --git a/tests/ipc.c b/tests/ipc.c index 4011f2ae..6ea0830c 100644 --- a/tests/ipc.c +++ b/tests/ipc.c @@ -38,14 +38,10 @@ check_props(nng_msg *msg) So(nng_pipe_get_addr(p, NNG_OPT_LOCADDR, &la) == 0); So(la.s_family == NNG_AF_IPC); // untyped - z = sizeof(nng_sockaddr); - So(nng_pipe_get(p, NNG_OPT_REMADDR, &ra, &z) == 0); - So(z == sizeof(ra)); + So(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra) == 0); So(ra.s_family == NNG_AF_IPC); So(nng_pipe_get_size(p, NNG_OPT_REMADDR, &z) == NNG_EBADTYPE); - z = 1; - So(nng_pipe_get(p, NNG_OPT_REMADDR, &ra, &z) == NNG_EINVAL); #ifdef _WIN32 So(nng_pipe_get_uint64(p, NNG_OPT_IPC_PEER_UID, &id) == NNG_ENOTSUP); diff --git a/tests/tcp.c b/tests/tcp.c index 1e4cfe11..2c80035c 100644 --- a/tests/tcp.c +++ b/tests/tcp.c @@ -40,16 +40,12 @@ check_props_v4(nng_msg *msg) So(la.s_in.sa_addr == htonl(0x7f000001)); // untyped - z = sizeof(nng_sockaddr); - So(nng_pipe_get(p, NNG_OPT_REMADDR, &ra, &z) == 0); - So(z == sizeof(ra)); + So(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra) == 0); So(ra.s_family == NNG_AF_INET); So(ra.s_in.sa_port != 0); So(ra.s_in.sa_addr == htonl(0x7f000001)); So(nng_pipe_get_size(p, NNG_OPT_REMADDR, &z) == NNG_EBADTYPE); - z = 1; - So(nng_pipe_get(p, NNG_OPT_REMADDR, &ra, &z) == NNG_EINVAL); So(nng_pipe_get_bool(p, NNG_OPT_TCP_KEEPALIVE, &b) == 0); So(b == false); // default @@ -60,6 +56,5 @@ check_props_v4(nng_msg *msg) return (0); } -TestMain("TCP Transport", { - trantest_test_extended("tcp://127.0.0.1:", check_props_v4); -}) +TestMain("TCP Transport", + { trantest_test_extended("tcp://127.0.0.1:", check_props_v4); }) diff --git a/tests/tcp6.c b/tests/tcp6.c index 3822fd80..79e6fa47 100644 --- a/tests/tcp6.c +++ b/tests/tcp6.c @@ -42,7 +42,6 @@ static int check_props_v6(nng_msg *msg) { nng_pipe p; - size_t z; uint8_t loopback[16]; memset(loopback, 0, sizeof(loopback)); @@ -50,11 +49,9 @@ check_props_v6(nng_msg *msg) // IPv6 Local address property works nng_sockaddr la; - z = sizeof(nng_sockaddr); p = nng_msg_get_pipe(msg); So(nng_pipe_id(p) > 0); - So(nng_pipe_get(p, NNG_OPT_LOCADDR, &la, &z) == 0); - So(z == sizeof(la)); + So(nng_pipe_get_addr(p, NNG_OPT_LOCADDR, &la) == 0); So(la.s_family == NNG_AF_INET6); // So(la.s_in.sa_port == (trantest_port - 1)); So(la.s_in6.sa_port != 0); @@ -62,11 +59,9 @@ check_props_v6(nng_msg *msg) // IPv6 Remote address property works nng_sockaddr ra; - z = sizeof(nng_sockaddr); p = nng_msg_get_pipe(msg); So(nng_pipe_id(p) > 0); - So(nng_pipe_get(p, NNG_OPT_REMADDR, &ra, &z) == 0); - So(z == sizeof(ra)); + So(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra) == 0); So(ra.s_family == NNG_AF_INET6); So(ra.s_in6.sa_port != 0); So(memcmp(ra.s_in6.sa_addr, loopback, 16) == 0); diff --git a/tests/tcpsupp.c b/tests/tcpsupp.c index ac1ed200..be947129 100644 --- a/tests/tcpsupp.c +++ b/tests/tcpsupp.c @@ -27,21 +27,18 @@ TestMain("Supplemental TCP", { }); Convey("Listener listens (wildcard)", { nng_sockaddr sa; - size_t sz; uint8_t ip[4]; So(nng_stream_listener_alloc(&l, "tcp://127.0.0.1") == 0); So(nng_stream_listener_listen(l) == 0); - sz = sizeof(sa); ip[0] = 127; ip[1] = 0; ip[2] = 0; ip[3] = 1; - So(nng_stream_listener_get( - l, NNG_OPT_LOCADDR, &sa, &sz) == 0); - So(sz == sizeof(sa)); + So(nng_stream_listener_get_addr( + l, NNG_OPT_LOCADDR, &sa) == 0); So(sa.s_in.sa_port != 0); So(memcmp(&sa.s_in.sa_addr, ip, 4) == 0); diff --git a/tests/ws.c b/tests/ws.c index d2ae7f9b..041fe4d0 100644 --- a/tests/ws.c +++ b/tests/ws.c @@ -23,11 +23,9 @@ static int check_props_v4(nng_msg *msg) { nng_pipe p; - size_t z; nng_sockaddr la; nng_sockaddr ra; char *buf; - size_t len; p = nng_msg_get_pipe(msg); So(nng_pipe_id(p) > 0); @@ -38,42 +36,20 @@ check_props_v4(nng_msg *msg) So(la.s_in.sa_port != 0); So(la.s_in.sa_addr == htonl(0x7f000001)); - z = sizeof(nng_sockaddr); - So(nng_pipe_get(p, NNG_OPT_REMADDR, &ra, &z) == 0); - So(z == sizeof(ra)); + So(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra) == 0); So(ra.s_family == NNG_AF_INET); So(ra.s_in.sa_port != 0); So(ra.s_in.sa_addr == htonl(0x7f000001)); // Request Header - z = 0; buf = NULL; - So(nng_pipe_get(p, NNG_OPT_WS_REQUEST_HEADERS, buf, &z) == NNG_EINVAL); - So(z > 0); - len = z; - So((buf = nng_alloc(len)) != NULL); - So(nng_pipe_get(p, NNG_OPT_WS_REQUEST_HEADERS, buf, &z) == 0); - So(strstr(buf, "Sec-WebSocket-Key") != NULL); - So(z == len); - nng_free(buf, len); So(nng_pipe_get_string(p, NNG_OPT_WS_REQUEST_HEADERS, &buf) == 0); - So(strlen(buf) == len - 1); + So(strstr(buf, "Sec-WebSocket-Key") != NULL); nng_strfree(buf); // Response Header - z = 0; - buf = NULL; - So(nng_pipe_get(p, NNG_OPT_WS_RESPONSE_HEADERS, buf, &z) == - NNG_EINVAL); - So(z > 0); - len = z; - So((buf = nng_alloc(len)) != NULL); - So(nng_pipe_get(p, NNG_OPT_WS_RESPONSE_HEADERS, buf, &z) == 0); - So(strstr(buf, "Sec-WebSocket-Accept") != NULL); - So(z == len); - nng_free(buf, len); So(nng_pipe_get_string(p, NNG_OPT_WS_RESPONSE_HEADERS, &buf) == 0); - So(strlen(buf) == len - 1); + So(strstr(buf, "Sec-WebSocket-Accept") != NULL); nng_strfree(buf); return (0); diff --git a/tests/wss.c b/tests/wss.c index 660ede3b..28b578fc 100644 --- a/tests/wss.c +++ b/tests/wss.c @@ -132,49 +132,30 @@ static int check_props(nng_msg *msg) { nng_pipe p; - size_t z; nng_sockaddr la; nng_sockaddr ra; char *buf; - size_t len; p = nng_msg_get_pipe(msg); So(nng_pipe_id(p) > 0); - z = sizeof(nng_sockaddr); - So(nng_pipe_get(p, NNG_OPT_LOCADDR, &la, &z) == 0); - So(z == sizeof(la)); + So(nng_pipe_get_addr(p, NNG_OPT_LOCADDR, &la) == 0); So(validloopback(&la)); - z = sizeof(nng_sockaddr); - So(nng_pipe_get(p, NNG_OPT_REMADDR, &ra, &z) == 0); - So(z == sizeof(ra)); + So(nng_pipe_get_addr(p, NNG_OPT_REMADDR, &ra) == 0); So(validloopback(&ra)); // Request header - z = 0; buf = NULL; - So(nng_pipe_get(p, NNG_OPT_WS_REQUEST_HEADERS, buf, &z) == NNG_EINVAL); - So(z > 0); - len = z; - So((buf = nng_alloc(len)) != NULL); - So(nng_pipe_get(p, NNG_OPT_WS_REQUEST_HEADERS, buf, &z) == 0); + So(nng_pipe_get_string(p, NNG_OPT_WS_REQUEST_HEADERS, &buf) == 0); So(strstr(buf, "Sec-WebSocket-Key") != NULL); - So(z == len); - nng_free(buf, len); + nng_strfree(buf); // Response header - z = 0; buf = NULL; - So(nng_pipe_get(p, NNG_OPT_WS_RESPONSE_HEADERS, buf, &z) == - NNG_EINVAL); - So(z > 0); - len = z; - So((buf = nng_alloc(len)) != NULL); - So(nng_pipe_get(p, NNG_OPT_WS_RESPONSE_HEADERS, buf, &z) == 0); + So(nng_pipe_get_string(p, NNG_OPT_WS_RESPONSE_HEADERS, &buf) == 0); So(strstr(buf, "Sec-WebSocket-Accept") != NULL); - So(z == len); - nng_free(buf, len); + nng_strfree(buf); return (0); } -- cgit v1.2.3-70-g09d2