The branch, master has been updated via 5e4b246 tests: test uid_wrapper_syscall_{valid,va} interaction using swrap_fake_uid_wrapper.so via a4e2437 src/socket_wrapper.c: make use of uid_wrapper_syscall_{valid,va}() via 1b8d5d8 src/socket_wrapper.c: export socket_wrapper_syscall_{valid,va}() via 79ce9b9 tests: let test_echo_tcp_sendmmsg_recvmmsg check raw SYS_close, SYS_recvmmsg and SYS_sendmmsg via 72da1a7 src/socket_wrapper.c: handle raw SYS_close, SYS_recvmmsg and SYS_sendmmsg syscall() invocations via 7fbf20d tests: add test_echo_tcp_sendmmsg_recvmmsg via f9342dc src/socket_wrapper.c: implement recvmmsg and sendmmsg via d04424e src/socket_wrapper.c: add some tracing for connected dgram sockets via 6af6c5e src/socket_wrapper.c: don't leak unlink() errno (most likely ENOENT) in swrap_bind() via 2f67c6b src/socket_wrapper.c: pretty print ip addresses in tracing output. from f88fe92 Bump version to 1.3.5
https://git.samba.org/?p=socket_wrapper.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 5e4b2466d291f37a6deb1b4c7ae56d76b4402557 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 21:57:35 2023 +0100 tests: test uid_wrapper_syscall_{valid,va} interaction using swrap_fake_uid_wrapper.so Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit a4e2437d5f0a89880d45c2cf685f3e81654a23a7 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 19:51:05 2023 +0100 src/socket_wrapper.c: make use of uid_wrapper_syscall_{valid,va}() If we find uid_wrapper_syscall_{valid,va}() symbols in the already loaded libraries, we'll try to hand over syscall() invocations to uid_wrapper. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 1b8d5d8c6e0bd56ec4883e2b09f4f2cedd3aa1d7 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 19:48:57 2023 +0100 src/socket_wrapper.c: export socket_wrapper_syscall_{valid,va}() We need to hook into syscall() from socket_wrapper as well as from uid_wrapper() (and maybe others in future). But the assumption is that only one wrapper will take care of a single syscall number. So we provide socket_wrapper_syscall_valid() in order to allow external consumers (e.g. uid_wrapper.so) to check if socket_wrapper wants to handle a specified syscall number. And we provide socket_wrapper_syscall_va() in order to allow calling into swrap_syscall(). Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 79ce9b9b14ac83a33712d6af4eecdb63bba45742 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 20:14:26 2023 +0100 tests: let test_echo_tcp_sendmmsg_recvmmsg check raw SYS_close, SYS_recvmmsg and SYS_sendmmsg Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 72da1a76e78bcf9be733ec72cce7060a6e19606a Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 19:46:13 2023 +0100 src/socket_wrapper.c: handle raw SYS_close, SYS_recvmmsg and SYS_sendmmsg syscall() invocations This fixes a problem hit by 'nsupdate -g' and bind9 (dnsutils). If bind is built against libuv <= 1.44.2 it will not use sendmmsg/recvmmsg functions from libc but use the corresponding syscalls directly. Newer version of libuv removed the syscall wrappers and use sendmmsg/recvmmsg from libc. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 7fbf20da01e9cc2031e92111bc794048a13d5f50 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 19:27:12 2023 +0100 tests: add test_echo_tcp_sendmmsg_recvmmsg Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit f9342dcf3d9a163dd9f3aee324a14a3ac0d423ac Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 17:00:48 2023 +0100 src/socket_wrapper.c: implement recvmmsg and sendmmsg Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit d04424e0baddc969d06623e38a67937cb2c83587 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 16:58:04 2023 +0100 src/socket_wrapper.c: add some tracing for connected dgram sockets Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 6af6c5e59a9b522294c3a83a3efb0eccc1211087 Author: Stefan Metzmacher <me...@samba.org> Date: Sun Nov 6 16:07:21 2022 +0100 src/socket_wrapper.c: don't leak unlink() errno (most likely ENOENT) in swrap_bind() This fixes a problem hit by 'nsupdate -g' from the bind9-dnsutils 1:9.18.1-1ubuntu1.2 package. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 2f67c6bef20e58676851df668f70fd261eea89ea Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 16 16:50:32 2023 +0100 src/socket_wrapper.c: pretty print ip addresses in tracing output. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> ----------------------------------------------------------------------- Summary of changes: ConfigureChecks.cmake | 43 ++ config.h.cmake | 9 + src/socket_wrapper.c | 887 +++++++++++++++++++++++++++++++- tests/CMakeLists.txt | 12 + tests/swrap_fake_uid_wrapper.c | 44 ++ tests/swrap_fake_uid_wrapper.h | 7 + tests/test_echo_tcp_sendmmsg_recvmmsg.c | 427 +++++++++++++++ tests/test_syscall_uwrap.c | 54 ++ 8 files changed, 1466 insertions(+), 17 deletions(-) create mode 100644 tests/swrap_fake_uid_wrapper.c create mode 100644 tests/swrap_fake_uid_wrapper.h create mode 100644 tests/test_echo_tcp_sendmmsg_recvmmsg.c create mode 100644 tests/test_syscall_uwrap.c Changeset truncated at 500 lines: diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index 2c78b83..b820a65 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -48,8 +48,10 @@ check_include_file(sys/filio.h HAVE_SYS_FILIO_H) check_include_file(sys/signalfd.h HAVE_SYS_SIGNALFD_H) check_include_file(sys/eventfd.h HAVE_SYS_EVENTFD_H) check_include_file(sys/timerfd.h HAVE_SYS_TIMERFD_H) +check_include_file(sys/syscall.h HAVE_SYS_SYSCALL_H) check_include_file(gnu/lib-names.h HAVE_GNU_LIB_NAMES_H) check_include_file(rpc/rpc.h HAVE_RPC_RPC_H) +check_include_file(syscall.h HAVE_SYSCALL_H) # SYMBOLS set(CMAKE_REQUIRED_FLAGS -D_GNU_SOURCE) @@ -75,6 +77,9 @@ check_function_exists(pledge HAVE_PLEDGE) check_function_exists(_socket HAVE__SOCKET) check_function_exists(_close HAVE__CLOSE) check_function_exists(__close_nocancel HAVE___CLOSE_NOCANCEL) +check_function_exists(recvmmsg HAVE_RECVMMSG) +check_function_exists(sendmmsg HAVE_SENDMMSG) +check_function_exists(syscall HAVE_SYSCALL) if (UNIX) find_library(DLFCN_LIBRARY dl) @@ -147,6 +152,44 @@ if (HAVE_EVENTFD) HAVE_EVENTFD_UNSIGNED_INT) endif (HAVE_EVENTFD) +if (HAVE_SYSCALL) + set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE) + + check_prototype_definition(syscall + "int syscall(int sysno, ...)" + "-1" + "unistd.h;sys/syscall.h" + HAVE_SYSCALL_INT) + set(CMAKE_REQUIRED_DEFINITIONS) +endif (HAVE_SYSCALL) + +if (HAVE_RECVMMSG) + # Linux legacy glibc < 2.21 + set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE) + check_prototype_definition(recvmmsg + "int recvmmsg(int __fd, struct mmsghdr *__vmessages, unsigned int __vlen, int __flags, const struct timespec *__tmo)" + "-1" + "sys/types.h;sys/socket.h" + HAVE_RECVMMSG_CONST_TIMEOUT) + set(CMAKE_REQUIRED_DEFINITIONS) + + # FreeBSD + check_prototype_definition(recvmmsg + "ssize_t recvmmsg(int __fd, struct mmsghdr * __restrict __vmessages, size_t __vlen, int __flags, const struct timespec * __restrict __tmo)" + "-1" + "sys/types.h;sys/socket.h" + HAVE_RECVMMSG_SSIZE_T_CONST_TIMEOUT) +endif (HAVE_RECVMMSG) + +if (HAVE_SENDMMSG) + # FreeBSD + check_prototype_definition(sendmmsg + "ssize_t sendmmsg(int __fd, struct mmsghdr * __restrict __vmessages, size_t __vlen, int __flags)" + "-1" + "sys/types.h;sys/socket.h" + HAVE_SENDMMSG_SSIZE_T) +endif (HAVE_SENDMMSG) + # IPV6 check_c_source_compiles(" #include <stdlib.h> diff --git a/config.h.cmake b/config.h.cmake index 0f2fb09..a637a34 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -13,9 +13,11 @@ #cmakedefine HAVE_SYS_FILIO_H 1 #cmakedefine HAVE_SYS_SIGNALFD_H 1 #cmakedefine HAVE_SYS_EVENTFD_H 1 +#cmakedefine HAVE_SYS_SYSCALL_H 1 #cmakedefine HAVE_SYS_TIMERFD_H 1 #cmakedefine HAVE_GNU_LIB_NAMES_H 1 #cmakedefine HAVE_RPC_RPC_H 1 +#cmakedefine HAVE_SYSCALL_H 1 /**************************** STRUCTS ****************************/ @@ -52,6 +54,13 @@ #cmakedefine HAVE_ACCEPT_PSOCKLEN_T 1 #cmakedefine HAVE_IOCTL_INT 1 #cmakedefine HAVE_EVENTFD_UNSIGNED_INT 1 +#cmakedefine HAVE_RECVMMSG 1 +#cmakedefine HAVE_RECVMMSG_CONST_TIMEOUT 1 +#cmakedefine HAVE_RECVMMSG_SSIZE_T_CONST_TIMEOUT 1 +#cmakedefine HAVE_SENDMMSG 1 +#cmakedefine HAVE_SENDMMSG_SSIZE_T 1 +#cmakedefine HAVE_SYSCALL 1 +#cmakedefine HAVE_SYSCALL_INT 1 /*************************** LIBRARIES ***************************/ diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c index bedda07..bf4a976 100644 --- a/src/socket_wrapper.c +++ b/src/socket_wrapper.c @@ -47,6 +47,12 @@ #include <sys/types.h> #include <sys/time.h> #include <sys/stat.h> +#ifdef HAVE_SYS_SYSCALL_H +#include <sys/syscall.h> +#endif +#ifdef HAVE_SYSCALL_H +#include <syscall.h> +#endif #include <sys/socket.h> #include <sys/ioctl.h> #ifdef HAVE_SYS_FILIO_H @@ -537,8 +543,29 @@ typedef int (*__libc_recvfrom)(int sockfd, struct sockaddr *src_addr, socklen_t *addrlen); typedef int (*__libc_recvmsg)(int sockfd, const struct msghdr *msg, int flags); +#ifdef HAVE_RECVMMSG +#if defined(HAVE_RECVMMSG_SSIZE_T_CONST_TIMEOUT) +/* FreeBSD */ +typedef ssize_t (*__libc_recvmmsg)(int sockfd, struct mmsghdr *msgvec, size_t vlen, int flags, const struct timespec *timeout); +#elif defined(HAVE_RECVMMSG_CONST_TIMEOUT) +/* Linux legacy glibc < 2.21 */ +typedef int (*__libc_recvmmsg)(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags, const struct timespec *timeout); +#else +/* Linux glibc >= 2.21 */ +typedef int (*__libc_recvmmsg)(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags, struct timespec *timeout); +#endif +#endif /* HAVE_RECVMMSG */ typedef int (*__libc_send)(int sockfd, const void *buf, size_t len, int flags); typedef int (*__libc_sendmsg)(int sockfd, const struct msghdr *msg, int flags); +#ifdef HAVE_SENDMMSG +#if defined(HAVE_SENDMMSG_SSIZE_T) +/* FreeBSD */ +typedef ssize_t (*__libc_sendmmsg)(int sockfd, struct mmsghdr *msgvec, size_t vlen, int flags); +#else +/* Linux */ +typedef int (*__libc_sendmmsg)(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags); +#endif +#endif /* HAVE_SENDMMSG */ typedef int (*__libc_sendto)(int sockfd, const void *buf, size_t len, @@ -560,6 +587,9 @@ typedef int (*__libc_timerfd_create)(int clockid, int flags); #endif typedef ssize_t (*__libc_write)(int fd, const void *buf, size_t count); typedef ssize_t (*__libc_writev)(int fd, const struct iovec *iov, int iovcnt); +#ifdef HAVE_SYSCALL +typedef long int (*__libc_syscall)(long int sysno, ...); +#endif #define SWRAP_SYMBOL_ENTRY(i) \ union { \ @@ -605,8 +635,14 @@ struct swrap_libc_symbols { SWRAP_SYMBOL_ENTRY(recv); SWRAP_SYMBOL_ENTRY(recvfrom); SWRAP_SYMBOL_ENTRY(recvmsg); +#ifdef HAVE_RECVMMSG + SWRAP_SYMBOL_ENTRY(recvmmsg); +#endif SWRAP_SYMBOL_ENTRY(send); SWRAP_SYMBOL_ENTRY(sendmsg); +#ifdef HAVE_SENDMMSG + SWRAP_SYMBOL_ENTRY(sendmmsg); +#endif SWRAP_SYMBOL_ENTRY(sendto); SWRAP_SYMBOL_ENTRY(setsockopt); #ifdef HAVE_SIGNALFD @@ -619,7 +655,32 @@ struct swrap_libc_symbols { #endif SWRAP_SYMBOL_ENTRY(write); SWRAP_SYMBOL_ENTRY(writev); +#ifdef HAVE_SYSCALL + SWRAP_SYMBOL_ENTRY(syscall); +#endif }; +#undef SWRAP_SYMBOL_ENTRY + +#define SWRAP_SYMBOL_ENTRY(i) \ + union { \ + __rtld_default_##i f; \ + void *obj; \ + } _rtld_default_##i + +#ifdef HAVE_SYSCALL +typedef bool (*__rtld_default_uid_wrapper_syscall_valid)(long int sysno); +typedef long int (*__rtld_default_uid_wrapper_syscall_va)(long int sysno, va_list va); +#endif + +struct swrap_rtld_default_symbols { +#ifdef HAVE_SYSCALL + SWRAP_SYMBOL_ENTRY(uid_wrapper_syscall_valid); + SWRAP_SYMBOL_ENTRY(uid_wrapper_syscall_va); +#else + uint8_t dummy; +#endif +}; +#undef SWRAP_SYMBOL_ENTRY struct swrap { struct { @@ -627,6 +688,10 @@ struct swrap { void *socket_handle; struct swrap_libc_symbols symbols; } libc; + + struct { + struct swrap_rtld_default_symbols symbols; + } rtld_default; }; static struct swrap swrap; @@ -807,6 +872,11 @@ static void _swrap_mutex_unlock(pthread_mutex_t *mutex, const char *name, const #define swrap_bind_symbol_libsocket(sym_name) \ _swrap_bind_symbol_generic(SWRAP_LIBSOCKET, sym_name) +#define swrap_bind_symbol_rtld_default_optional(sym_name) do { \ + swrap.rtld_default.symbols._rtld_default_##sym_name.obj = \ + dlsym(RTLD_DEFAULT, #sym_name); \ +} while(0); + static void swrap_bind_symbol_all(void); /**************************************************************************** @@ -1131,6 +1201,24 @@ static int libc_recvmsg(int sockfd, struct msghdr *msg, int flags) return swrap.libc.symbols._libc_recvmsg.f(sockfd, msg, flags); } +#ifdef HAVE_RECVMMSG +#if defined(HAVE_RECVMMSG_SSIZE_T_CONST_TIMEOUT) +/* FreeBSD */ +static ssize_t libc_recvmmsg(int sockfd, struct mmsghdr *msgvec, size_t vlen, int flags, const struct timespec *timeout) +#elif defined(HAVE_RECVMMSG_CONST_TIMEOUT) +/* Linux legacy glibc < 2.21 */ +static int libc_recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags, const struct timespec *timeout) +#else +/* Linux glibc >= 2.21 */ +static int libc_recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags, struct timespec *timeout) +#endif +{ + swrap_bind_symbol_all(); + + return swrap.libc.symbols._libc_recvmmsg.f(sockfd, msgvec, vlen, flags, timeout); +} +#endif + static int libc_send(int sockfd, const void *buf, size_t len, int flags) { swrap_bind_symbol_all(); @@ -1145,6 +1233,21 @@ static int libc_sendmsg(int sockfd, const struct msghdr *msg, int flags) return swrap.libc.symbols._libc_sendmsg.f(sockfd, msg, flags); } +#ifdef HAVE_SENDMMSG +#if defined(HAVE_SENDMMSG_SSIZE_T) +/* FreeBSD */ +static ssize_t libc_sendmmsg(int sockfd, struct mmsghdr *msgvec, size_t vlen, int flags) +#else +/* Linux */ +static int libc_sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags) +#endif +{ + swrap_bind_symbol_all(); + + return swrap.libc.symbols._libc_sendmmsg.f(sockfd, msgvec, vlen, flags); +} +#endif + static int libc_sendto(int sockfd, const void *buf, size_t len, @@ -1223,6 +1326,64 @@ static ssize_t libc_writev(int fd, const struct iovec *iov, int iovcnt) return swrap.libc.symbols._libc_writev.f(fd, iov, iovcnt); } +#ifdef HAVE_SYSCALL +DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE +static long int libc_vsyscall(long int sysno, va_list va) +{ + long int args[8]; + long int rc; + int i; + + swrap_bind_symbol_all(); + + for (i = 0; i < 8; i++) { + args[i] = va_arg(va, long int); + } + + rc = swrap.libc.symbols._libc_syscall.f(sysno, + args[0], + args[1], + args[2], + args[3], + args[4], + args[5], + args[6], + args[7]); + + return rc; +} + +static bool swrap_uwrap_syscall_valid(long int sysno) +{ + swrap_bind_symbol_all(); + + if (swrap.rtld_default.symbols._rtld_default_uid_wrapper_syscall_valid.f == NULL) { + return false; + } + + return swrap.rtld_default.symbols._rtld_default_uid_wrapper_syscall_valid.f( + sysno); +} + +DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE +static long int swrap_uwrap_syscall_va(long int sysno, va_list va) +{ + swrap_bind_symbol_all(); + + if (swrap.rtld_default.symbols._rtld_default_uid_wrapper_syscall_va.f == NULL) { + /* + * Fallback to libc, if uid_wrapper_syscall_va is not + * available. + */ + return libc_vsyscall(sysno, va); + } + + return swrap.rtld_default.symbols._rtld_default_uid_wrapper_syscall_va.f( + sysno, + va); +} +#endif /* HAVE_SYSCALL */ + /* DO NOT call this function during library initialization! */ static void __swrap_bind_symbol_all_once(void) { @@ -1263,8 +1424,14 @@ static void __swrap_bind_symbol_all_once(void) swrap_bind_symbol_libsocket(recv); swrap_bind_symbol_libsocket(recvfrom); swrap_bind_symbol_libsocket(recvmsg); +#ifdef HAVE_RECVMMSG + swrap_bind_symbol_libsocket(recvmmsg); +#endif swrap_bind_symbol_libsocket(send); swrap_bind_symbol_libsocket(sendmsg); +#ifdef HAVE_SENDMMSG + swrap_bind_symbol_libsocket(sendmmsg); +#endif swrap_bind_symbol_libsocket(sendto); swrap_bind_symbol_libsocket(setsockopt); #ifdef HAVE_SIGNALFD @@ -1277,6 +1444,11 @@ static void __swrap_bind_symbol_all_once(void) #endif swrap_bind_symbol_libc(write); swrap_bind_symbol_libsocket(writev); +#ifdef HAVE_SYSCALL + swrap_bind_symbol_libc(syscall); + swrap_bind_symbol_rtld_default_optional(uid_wrapper_syscall_valid); + swrap_bind_symbol_rtld_default_optional(uid_wrapper_syscall_va); +#endif } static void swrap_bind_symbol_all(void) @@ -1429,6 +1601,55 @@ static size_t socket_length(int family) return 0; } +struct swrap_sockaddr_buf { + char str[128]; +}; + +static const char *swrap_sockaddr_string(struct swrap_sockaddr_buf *buf, + const struct sockaddr *saddr) +{ + unsigned int port = 0; + char addr[64] = {0,}; + + switch (saddr->sa_family) { + case AF_INET: { + const struct sockaddr_in *in = + (const struct sockaddr_in *)(const void *)saddr; + + port = ntohs(in->sin_port); + + inet_ntop(saddr->sa_family, + &in->sin_addr, + addr, sizeof(addr)); + break; + } +#ifdef HAVE_IPV6 + case AF_INET6: { + const struct sockaddr_in6 *in6 = + (const struct sockaddr_in6 *)(const void *)saddr; + + port = ntohs(in6->sin6_port); + + inet_ntop(saddr->sa_family, + &in6->sin6_addr, + addr, sizeof(addr)); + break; + } +#endif + default: + snprintf(addr, sizeof(addr), + "<Unknown address family %u>", + saddr->sa_family); + break; + } + + snprintf(buf->str, sizeof(buf->str), + "addr[%s]/port[%u]", + addr, port); + + return buf->str; +} + static struct socket_info *swrap_get_socket_info(int si_index) { return (struct socket_info *)(&(sockets[si_index].info)); @@ -2064,13 +2285,10 @@ static int convert_in_un_remote(struct socket_info *si, const struct sockaddr *i type = u_type; iface = (addr & 0x000000FF); } else { - char str[256] = {0,}; - inet_ntop(inaddr->sa_family, - &in->sin_addr, - str, sizeof(str)); + struct swrap_sockaddr_buf buf = {}; SWRAP_LOG(SWRAP_LOG_WARN, - "str[%s] prt[%u]", - str, (unsigned)prt); + "%s", + swrap_sockaddr_string(&buf, inaddr)); errno = ENETUNREACH; return -1; } @@ -2106,13 +2324,10 @@ static int convert_in_un_remote(struct socket_info *si, const struct sockaddr *i if (IN6_ARE_ADDR_EQUAL(&cmp1, &cmp2)) { iface = in->sin6_addr.s6_addr[15]; } else { - char str[256] = {0,}; - inet_ntop(inaddr->sa_family, - &in->sin6_addr, - str, sizeof(str)); + struct swrap_sockaddr_buf buf = {}; SWRAP_LOG(SWRAP_LOG_WARN, - "str[%s] prt[%u]", - str, (unsigned)prt); + "%s", + swrap_sockaddr_string(&buf, inaddr)); errno = ENETUNREACH; return -1; } @@ -3984,6 +4199,7 @@ static int swrap_connect(int s, const struct sockaddr *serv_addr, .sa_socklen = sizeof(struct sockaddr_un), }; struct socket_info *si = find_socket_info(s); + struct swrap_sockaddr_buf buf = {}; int bcast = 0; if (!si) { @@ -4032,7 +4248,8 @@ static int swrap_connect(int s, const struct sockaddr *serv_addr, } SWRAP_LOG(SWRAP_LOG_TRACE, - "connect() path=%s, fd=%d", + "connect(%s) path=%s, fd=%d", + swrap_sockaddr_string(&buf, serv_addr), un_addr.sa.un.sun_path, s); @@ -4098,6 +4315,8 @@ static int swrap_bind(int s, const struct sockaddr *myaddr, socklen_t addrlen) .sa_socklen = sizeof(struct sockaddr_un), }; struct socket_info *si = find_socket_info(s); + struct swrap_sockaddr_buf buf = {}; + int ret_errno = errno; int bind_error = 0; #if 0 /* FIXME */ bool in_use; @@ -4155,7 +4374,7 @@ static int swrap_bind(int s, const struct sockaddr *myaddr, socklen_t addrlen) } if (bind_error != 0) { - errno = bind_error; + ret_errno = bind_error; ret = -1; goto out; } @@ -4179,16 +4398,21 @@ static int swrap_bind(int s, const struct sockaddr *myaddr, socklen_t addrlen) 1, &si->bcast); if (ret == -1) { + ret_errno = errno; goto out; } -- Socket Wrapper Repository