mirror of
https://github.com/samba-team/samba.git
synced 2024-12-22 13:34:15 +03:00
third_party: Update socket_wrapper to version 1.4.3
This fixes issues with bind compiled with jemalloc. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15660 Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org> Autobuild-Date(master): Thu Jun 13 08:41:39 UTC 2024 on atb-devel-224
This commit is contained in:
parent
f88e60644e
commit
8ae180e167
@ -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.2')
|
||||
return conf.CHECK_BUNDLED_SYSTEM_PKG('socket_wrapper', minversion='1.4.3')
|
||||
Build.BuildContext.CHECK_SOCKET_WRAPPER = CHECK_SOCKET_WRAPPER
|
||||
|
||||
@conf
|
||||
|
45
third_party/socket_wrapper/socket_wrapper.c
vendored
45
third_party/socket_wrapper/socket_wrapper.c
vendored
@ -1388,6 +1388,9 @@ static ssize_t libc_writev(int fd, const struct iovec *iov, int iovcnt)
|
||||
return swrap.libc.symbols._libc_writev.f(fd, iov, iovcnt);
|
||||
}
|
||||
|
||||
/* JEMALLOC: This tells socket_wrapper if it should handle syscall() */
|
||||
static bool swrap_handle_syscall;
|
||||
|
||||
#ifdef HAVE_SYSCALL
|
||||
DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE
|
||||
static long int libc_vsyscall(long int sysno, va_list va)
|
||||
@ -1396,7 +1399,27 @@ static long int libc_vsyscall(long int sysno, va_list va)
|
||||
long int rc;
|
||||
int i;
|
||||
|
||||
swrap_bind_symbol_all();
|
||||
/*
|
||||
* JEMALLOC:
|
||||
*
|
||||
* This is a workaround to prevent a deadlock in jemalloc calling
|
||||
* malloc_init() twice. The first allocation call will trigger a
|
||||
* malloc_init() of jemalloc. The functions calls syscall(SYS_open, ...)
|
||||
* so it goes to socket or uid wrapper. In this code path we need to
|
||||
* avoid any allocation calls. This will prevent the deadlock.
|
||||
*
|
||||
* We also need to avoid dlopen() as that would trigger the recursion
|
||||
* into malloc_init(), so we use dlsym(RTLD_NEXT), until we reached
|
||||
* swrap_constructor() or any real socket call at that time
|
||||
* swrap_bind_symbol_all() will replace the function pointer again after
|
||||
* dlopen of libc.
|
||||
*/
|
||||
if (swrap_handle_syscall) {
|
||||
swrap_bind_symbol_all();
|
||||
} else if (swrap.libc.symbols._libc_syscall.obj == NULL) {
|
||||
swrap.libc.symbols._libc_syscall.obj = dlsym(RTLD_NEXT,
|
||||
"syscall");
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
args[i] = va_arg(va, long int);
|
||||
@ -1517,6 +1540,8 @@ static void __swrap_bind_symbol_all_once(void)
|
||||
swrap_bind_symbol_rtld_default_optional(uid_wrapper_syscall_valid);
|
||||
swrap_bind_symbol_rtld_default_optional(uid_wrapper_syscall_va);
|
||||
#endif
|
||||
|
||||
swrap_handle_syscall = true;
|
||||
}
|
||||
|
||||
static void swrap_bind_symbol_all(void)
|
||||
@ -8744,6 +8769,21 @@ long int syscall(long int sysno, ...)
|
||||
|
||||
va_start(va, sysno);
|
||||
|
||||
/*
|
||||
* JEMALLOC:
|
||||
*
|
||||
* This is a workaround to prevent a deadlock in jemalloc calling
|
||||
* malloc_init() twice. The first allocation call will trigger a
|
||||
* malloc_init() of jemalloc. The functions calls syscall(SYS_open, ...)
|
||||
* so it goes to socket or uid wrapper. In this code path we need to
|
||||
* avoid any allocation calls. This will prevent the deadlock.
|
||||
*/
|
||||
if (!swrap_handle_syscall) {
|
||||
rc = libc_vsyscall(sysno, va);
|
||||
va_end(va);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* We should only handle the syscall numbers
|
||||
* we care about...
|
||||
@ -8860,6 +8900,9 @@ void swrap_constructor(void)
|
||||
pthread_atfork(&swrap_thread_prepare,
|
||||
&swrap_thread_parent,
|
||||
&swrap_thread_child);
|
||||
|
||||
/* Let socket_wrapper handle syscall() */
|
||||
swrap_handle_syscall = true;
|
||||
}
|
||||
|
||||
/****************************
|
||||
|
3
third_party/socket_wrapper/wscript
vendored
3
third_party/socket_wrapper/wscript
vendored
@ -2,7 +2,7 @@
|
||||
|
||||
import os
|
||||
|
||||
VERSION = "1.4.2"
|
||||
VERSION = "1.4.3"
|
||||
|
||||
|
||||
def configure(conf):
|
||||
@ -10,6 +10,7 @@ def configure(conf):
|
||||
conf.DEFINE('USING_SYSTEM_SOCKET_WRAPPER', 1)
|
||||
libsocket_wrapper_so_path = 'libsocket_wrapper.so'
|
||||
else:
|
||||
conf.CHECK_HEADERS('gnu/lib-names.h')
|
||||
|
||||
if conf.CONFIG_SET("HAVE___THREAD"):
|
||||
conf.DEFINE("HAVE_GCC_THREAD_LOCAL_STORAGE", 1)
|
||||
|
Loading…
Reference in New Issue
Block a user