The branch, master has been updated via d720eb2c083 third_party: Update socket_wrapper to version 1.4.2 from afbed653526 s3:utils: smbget fix a memory leak
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit d720eb2c083f3d162e93011d69c4b742cd03f3aa Author: Andreas Schneider <a...@samba.org> Date: Wed Jun 21 12:40:16 2023 +0200 third_party: Update socket_wrapper to version 1.4.2 Signed-off-by: Andreas Schneider <a...@samba.org> Reviewed-by: Stefan Metzmacher <me...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Thu Jun 29 16:06:11 UTC 2023 on atb-devel-224 ----------------------------------------------------------------------- Summary of changes: buildtools/wafsamba/samba_third_party.py | 2 +- third_party/socket_wrapper/socket_wrapper.c | 182 ++++++++++++++++++++++++++++ third_party/socket_wrapper/wscript | 7 +- 3 files changed, 189 insertions(+), 2 deletions(-) Changeset truncated at 500 lines: diff --git a/buildtools/wafsamba/samba_third_party.py b/buildtools/wafsamba/samba_third_party.py index 356b041a2a9..52898486fd9 100644 --- a/buildtools/wafsamba/samba_third_party.py +++ b/buildtools/wafsamba/samba_third_party.py @@ -24,7 +24,7 @@ Build.BuildContext.CHECK_CMOCKA = CHECK_CMOCKA @conf def CHECK_SOCKET_WRAPPER(conf): - return conf.CHECK_BUNDLED_SYSTEM_PKG('socket_wrapper', minversion='1.4.0') + return conf.CHECK_BUNDLED_SYSTEM_PKG('socket_wrapper', minversion='1.4.2') Build.BuildContext.CHECK_SOCKET_WRAPPER = CHECK_SOCKET_WRAPPER @conf diff --git a/third_party/socket_wrapper/socket_wrapper.c b/third_party/socket_wrapper/socket_wrapper.c index bf4a976eaee..c759d350fb1 100644 --- a/third_party/socket_wrapper/socket_wrapper.c +++ b/third_party/socket_wrapper/socket_wrapper.c @@ -44,6 +44,12 @@ #include "config.h" +/* + * Make sure we do not redirect (f)open(at)() or fcntl() to their 64bit + * variants + */ +#undef _FILE_OFFSET_BITS + #include <sys/types.h> #include <sys/time.h> #include <sys/stat.h> @@ -94,6 +100,10 @@ #include "socket_wrapper.h" +#ifdef __USE_FILE_OFFSET64 +#error -D_FILE_OFFSET_BITS=64 should not be set for socket_wrapper! +#endif + enum swrap_dbglvl_e { SWRAP_LOG_ERROR = 0, SWRAP_LOG_WARN, @@ -507,6 +517,9 @@ typedef int (*__libc_connect)(int sockfd, typedef int (*__libc_dup)(int fd); typedef int (*__libc_dup2)(int oldfd, int newfd); typedef int (*__libc_fcntl)(int fd, int cmd, ...); +#ifdef HAVE_FCNTL64 +typedef int (*__libc_fcntl64)(int fd, int cmd, ...); +#endif typedef FILE *(*__libc_fopen)(const char *name, const char *mode); #ifdef HAVE_FOPEN64 typedef FILE *(*__libc_fopen64)(const char *name, const char *mode); @@ -531,6 +544,9 @@ typedef int (*__libc_open)(const char *pathname, int flags, ...); #ifdef HAVE_OPEN64 typedef int (*__libc_open64)(const char *pathname, int flags, ...); #endif /* HAVE_OPEN64 */ +#ifdef HAVE_OPENAT64 +typedef int (*__libc_openat64)(int dirfd, const char *pathname, int flags, ...); +#endif /* HAVE_OPENAT64 */ typedef int (*__libc_openat)(int dirfd, const char *path, int flags, ...); typedef int (*__libc_pipe)(int pipefd[2]); typedef int (*__libc_read)(int fd, void *buf, size_t count); @@ -612,6 +628,9 @@ struct swrap_libc_symbols { SWRAP_SYMBOL_ENTRY(dup); SWRAP_SYMBOL_ENTRY(dup2); SWRAP_SYMBOL_ENTRY(fcntl); +#ifdef HAVE_FCNTL64 + SWRAP_SYMBOL_ENTRY(fcntl64); +#endif SWRAP_SYMBOL_ENTRY(fopen); #ifdef HAVE_FOPEN64 SWRAP_SYMBOL_ENTRY(fopen64); @@ -627,6 +646,9 @@ struct swrap_libc_symbols { SWRAP_SYMBOL_ENTRY(open); #ifdef HAVE_OPEN64 SWRAP_SYMBOL_ENTRY(open64); +#endif +#ifdef HAVE_OPENAT64 + SWRAP_SYMBOL_ENTRY(openat64); #endif SWRAP_SYMBOL_ENTRY(openat); SWRAP_SYMBOL_ENTRY(pipe); @@ -983,6 +1005,23 @@ static int libc_vfcntl(int fd, int cmd, va_list ap) return rc; } +#ifdef HAVE_FCNTL64 +DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE +static int libc_vfcntl64(int fd, int cmd, va_list ap) +{ + void *arg; + int rc; + + swrap_bind_symbol_all(); + + arg = va_arg(ap, void *); + + rc = swrap.libc.symbols._libc_fcntl64.f(fd, cmd, arg); + + return rc; +} +#endif + static int libc_getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen) @@ -1115,6 +1154,29 @@ static int libc_vopen64(const char *pathname, int flags, va_list ap) } #endif /* HAVE_OPEN64 */ +#ifdef HAVE_OPENAT64 +static int +libc_vopenat64(int dirfd, const char *pathname, int flags, va_list ap) +{ + int mode = 0; + int fd; + + swrap_bind_symbol_all(); + + swrap_inject_o_largefile(&flags); + + if (flags & O_CREAT) { + mode = va_arg(ap, int); + } + fd = swrap.libc.symbols._libc_openat64.f(dirfd, + pathname, + flags, + (mode_t)mode); + + return fd; +} +#endif /* HAVE_OPENAT64 */ + static int libc_vopenat(int dirfd, const char *path, int flags, va_list ap) { int mode = 0; @@ -1401,6 +1463,9 @@ static void __swrap_bind_symbol_all_once(void) swrap_bind_symbol_libc(dup); swrap_bind_symbol_libc(dup2); swrap_bind_symbol_libc(fcntl); +#ifdef HAVE_FCNTL64 + swrap_bind_symbol_libc(fcntl64); +#endif swrap_bind_symbol_libc(fopen); #ifdef HAVE_FOPEN64 swrap_bind_symbol_libc(fopen64); @@ -1416,6 +1481,9 @@ static void __swrap_bind_symbol_all_once(void) swrap_bind_symbol_libc(open); #ifdef HAVE_OPEN64 swrap_bind_symbol_libc(open64); +#endif +#ifdef HAVE_OPENAT64 + swrap_bind_symbol_libc(openat64); #endif swrap_bind_symbol_libc(openat); swrap_bind_symbol_libsocket(pipe); @@ -4568,6 +4636,7 @@ static FILE *swrap_fopen(const char *name, const char *mode) return fp; } +#undef fopen /* Needed for LFS handling */ FILE *fopen(const char *name, const char *mode) { return swrap_fopen(name, mode); @@ -4619,6 +4688,7 @@ static int swrap_vopen(const char *pathname, int flags, va_list ap) return ret; } +#undef open /* Needed for LFS handling */ int open(const char *pathname, int flags, ...) { va_list ap; @@ -4666,6 +4736,42 @@ int open64(const char *pathname, int flags, ...) } #endif /* HAVE_OPEN64 */ +/**************************************************************************** + * OPENAT64 + ***************************************************************************/ + +#ifdef HAVE_OPENAT64 +static int +swrap_vopenat64(int dirfd, const char *pathname, int flags, va_list ap) +{ + int ret; + + ret = libc_vopenat64(dirfd, pathname, flags, ap); + if (ret != -1) { + /* + * There are methods for closing descriptors (libc-internal code + * paths, direct syscalls) which close descriptors in ways that + * we can't intercept, so try to recover when we notice that + * that's happened + */ + swrap_remove_stale(ret); + } + return ret; +} + +int openat64(int dirfd, const char *pathname, int flags, ...) +{ + va_list ap; + int fd; + + va_start(ap, flags); + fd = swrap_vopenat64(dirfd, pathname, flags, ap); + va_end(ap); + + return fd; +} +#endif /* HAVE_OPENAT64 */ + /**************************************************************************** * OPENAT ***************************************************************************/ @@ -4688,6 +4794,7 @@ static int swrap_vopenat(int dirfd, const char *path, int flags, va_list ap) return ret; } +#undef openat /* Needed for LFS handling */ int openat(int dirfd, const char *path, int flags, ...) { va_list ap; @@ -8412,6 +8519,7 @@ static int swrap_vfcntl(int fd, int cmd, va_list va) return rc; } +#undef fcntl /* Needed for LFS handling */ int fcntl(int fd, int cmd, ...) { va_list va; @@ -8426,6 +8534,80 @@ int fcntl(int fd, int cmd, ...) return rc; } +/**************************** + * FCNTL64 + ***************************/ + +#ifdef HAVE_FCNTL64 +static int swrap_vfcntl64(int fd, int cmd, va_list va) +{ + struct socket_info *si; + int rc, dup_fd, idx; + + idx = find_socket_info_index(fd); + if (idx == -1) { + return libc_vfcntl64(fd, cmd, va); + } + + si = swrap_get_socket_info(idx); + + switch (cmd) { + case F_DUPFD: + dup_fd = libc_vfcntl64(fd, cmd, va); + if (dup_fd == -1) { + int saved_errno = errno; + errno = saved_errno; + return -1; + } + + /* Make sure we don't have an entry for the fd */ + swrap_remove_stale(dup_fd); + + if ((size_t)dup_fd >= socket_fds_max) { + SWRAP_LOG(SWRAP_LOG_ERROR, + "The max socket index limit of %zu has been reached, " + "trying to add %d", + socket_fds_max, + dup_fd); + libc_close(dup_fd); + errno = EMFILE; + return -1; + } + + SWRAP_LOCK_SI(si); + + swrap_inc_refcount(si); + + SWRAP_UNLOCK_SI(si); + + + set_socket_info_index(dup_fd, idx); + + rc = dup_fd; + break; + default: + rc = libc_vfcntl64(fd, cmd, va); + break; + } + + return rc; +} + +int fcntl64(int fd, int cmd, ...) +{ + va_list va; + int rc; + + va_start(va, cmd); + + rc = swrap_vfcntl64(fd, cmd, va); + + va_end(va); + + return rc; +} +#endif + /**************************** * EVENTFD ***************************/ diff --git a/third_party/socket_wrapper/wscript b/third_party/socket_wrapper/wscript index bc5083847dc..fdd09f24ce9 100644 --- a/third_party/socket_wrapper/wscript +++ b/third_party/socket_wrapper/wscript @@ -2,7 +2,8 @@ import os -VERSION="1.4.0" +VERSION = "1.4.2" + def configure(conf): if conf.CHECK_SOCKET_WRAPPER(): @@ -55,6 +56,10 @@ def configure(conf): conf.CHECK_FUNCS('accept4') conf.CHECK_FUNCS('sendmmsg recvmmsg') conf.CHECK_FUNCS('__close_nocancel') + conf.CHECK_FUNCS('openat64') + conf.CHECK_FUNCS('fopen64') + conf.CHECK_FUNCS('open64') + conf.CHECK_FUNCS('fcntl64') conf.CHECK_FUNCS_IN('bind', 'socket', -- Samba Shared Repository