[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