[SCM] Socket Wrapper Repository - branch master updated

Andreas Schneider asn at samba.org
Tue Jan 17 18:31:49 UTC 2023


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 <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit a4e2437d5f0a89880d45c2cf685f3e81654a23a7
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 1b8d5d8c6e0bd56ec4883e2b09f4f2cedd3aa1d7
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 79ce9b9b14ac83a33712d6af4eecdb63bba45742
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 72da1a76e78bcf9be733ec72cce7060a6e19606a
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 7fbf20da01e9cc2031e92111bc794048a13d5f50
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 16 19:27:12 2023 +0100

    tests: add test_echo_tcp_sendmmsg_recvmmsg
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit f9342dcf3d9a163dd9f3aee324a14a3ac0d423ac
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 16 17:00:48 2023 +0100

    src/socket_wrapper.c: implement recvmmsg and sendmmsg
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit d04424e0baddc969d06623e38a67937cb2c83587
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 6af6c5e59a9b522294c3a83a3efb0eccc1211087
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 2f67c6bef20e58676851df668f70fd261eea89ea
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at 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



More information about the samba-cvs mailing list