mirror of
https://github.com/samba-team/samba.git
synced 2025-01-18 06:04:06 +03:00
third_party: Update socket_wrapper to version 1.4.2
Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org> Autobuild-User(master): Stefan Metzmacher <metze@samba.org> Autobuild-Date(master): Thu Jun 29 16:06:11 UTC 2023 on atb-devel-224
This commit is contained in:
parent
afbed65352
commit
d720eb2c08
@ -24,7 +24,7 @@ Build.BuildContext.CHECK_CMOCKA = CHECK_CMOCKA
|
|||||||
|
|
||||||
@conf
|
@conf
|
||||||
def CHECK_SOCKET_WRAPPER(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
|
Build.BuildContext.CHECK_SOCKET_WRAPPER = CHECK_SOCKET_WRAPPER
|
||||||
|
|
||||||
@conf
|
@conf
|
||||||
|
182
third_party/socket_wrapper/socket_wrapper.c
vendored
182
third_party/socket_wrapper/socket_wrapper.c
vendored
@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#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/types.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@ -94,6 +100,10 @@
|
|||||||
|
|
||||||
#include "socket_wrapper.h"
|
#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 {
|
enum swrap_dbglvl_e {
|
||||||
SWRAP_LOG_ERROR = 0,
|
SWRAP_LOG_ERROR = 0,
|
||||||
SWRAP_LOG_WARN,
|
SWRAP_LOG_WARN,
|
||||||
@ -507,6 +517,9 @@ typedef int (*__libc_connect)(int sockfd,
|
|||||||
typedef int (*__libc_dup)(int fd);
|
typedef int (*__libc_dup)(int fd);
|
||||||
typedef int (*__libc_dup2)(int oldfd, int newfd);
|
typedef int (*__libc_dup2)(int oldfd, int newfd);
|
||||||
typedef int (*__libc_fcntl)(int fd, int cmd, ...);
|
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);
|
typedef FILE *(*__libc_fopen)(const char *name, const char *mode);
|
||||||
#ifdef HAVE_FOPEN64
|
#ifdef HAVE_FOPEN64
|
||||||
typedef FILE *(*__libc_fopen64)(const char *name, const char *mode);
|
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
|
#ifdef HAVE_OPEN64
|
||||||
typedef int (*__libc_open64)(const char *pathname, int flags, ...);
|
typedef int (*__libc_open64)(const char *pathname, int flags, ...);
|
||||||
#endif /* HAVE_OPEN64 */
|
#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_openat)(int dirfd, const char *path, int flags, ...);
|
||||||
typedef int (*__libc_pipe)(int pipefd[2]);
|
typedef int (*__libc_pipe)(int pipefd[2]);
|
||||||
typedef int (*__libc_read)(int fd, void *buf, size_t count);
|
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(dup);
|
||||||
SWRAP_SYMBOL_ENTRY(dup2);
|
SWRAP_SYMBOL_ENTRY(dup2);
|
||||||
SWRAP_SYMBOL_ENTRY(fcntl);
|
SWRAP_SYMBOL_ENTRY(fcntl);
|
||||||
|
#ifdef HAVE_FCNTL64
|
||||||
|
SWRAP_SYMBOL_ENTRY(fcntl64);
|
||||||
|
#endif
|
||||||
SWRAP_SYMBOL_ENTRY(fopen);
|
SWRAP_SYMBOL_ENTRY(fopen);
|
||||||
#ifdef HAVE_FOPEN64
|
#ifdef HAVE_FOPEN64
|
||||||
SWRAP_SYMBOL_ENTRY(fopen64);
|
SWRAP_SYMBOL_ENTRY(fopen64);
|
||||||
@ -627,6 +646,9 @@ struct swrap_libc_symbols {
|
|||||||
SWRAP_SYMBOL_ENTRY(open);
|
SWRAP_SYMBOL_ENTRY(open);
|
||||||
#ifdef HAVE_OPEN64
|
#ifdef HAVE_OPEN64
|
||||||
SWRAP_SYMBOL_ENTRY(open64);
|
SWRAP_SYMBOL_ENTRY(open64);
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_OPENAT64
|
||||||
|
SWRAP_SYMBOL_ENTRY(openat64);
|
||||||
#endif
|
#endif
|
||||||
SWRAP_SYMBOL_ENTRY(openat);
|
SWRAP_SYMBOL_ENTRY(openat);
|
||||||
SWRAP_SYMBOL_ENTRY(pipe);
|
SWRAP_SYMBOL_ENTRY(pipe);
|
||||||
@ -983,6 +1005,23 @@ static int libc_vfcntl(int fd, int cmd, va_list ap)
|
|||||||
return rc;
|
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,
|
static int libc_getpeername(int sockfd,
|
||||||
struct sockaddr *addr,
|
struct sockaddr *addr,
|
||||||
socklen_t *addrlen)
|
socklen_t *addrlen)
|
||||||
@ -1115,6 +1154,29 @@ static int libc_vopen64(const char *pathname, int flags, va_list ap)
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_OPEN64 */
|
#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)
|
static int libc_vopenat(int dirfd, const char *path, int flags, va_list ap)
|
||||||
{
|
{
|
||||||
int mode = 0;
|
int mode = 0;
|
||||||
@ -1401,6 +1463,9 @@ static void __swrap_bind_symbol_all_once(void)
|
|||||||
swrap_bind_symbol_libc(dup);
|
swrap_bind_symbol_libc(dup);
|
||||||
swrap_bind_symbol_libc(dup2);
|
swrap_bind_symbol_libc(dup2);
|
||||||
swrap_bind_symbol_libc(fcntl);
|
swrap_bind_symbol_libc(fcntl);
|
||||||
|
#ifdef HAVE_FCNTL64
|
||||||
|
swrap_bind_symbol_libc(fcntl64);
|
||||||
|
#endif
|
||||||
swrap_bind_symbol_libc(fopen);
|
swrap_bind_symbol_libc(fopen);
|
||||||
#ifdef HAVE_FOPEN64
|
#ifdef HAVE_FOPEN64
|
||||||
swrap_bind_symbol_libc(fopen64);
|
swrap_bind_symbol_libc(fopen64);
|
||||||
@ -1416,6 +1481,9 @@ static void __swrap_bind_symbol_all_once(void)
|
|||||||
swrap_bind_symbol_libc(open);
|
swrap_bind_symbol_libc(open);
|
||||||
#ifdef HAVE_OPEN64
|
#ifdef HAVE_OPEN64
|
||||||
swrap_bind_symbol_libc(open64);
|
swrap_bind_symbol_libc(open64);
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_OPENAT64
|
||||||
|
swrap_bind_symbol_libc(openat64);
|
||||||
#endif
|
#endif
|
||||||
swrap_bind_symbol_libc(openat);
|
swrap_bind_symbol_libc(openat);
|
||||||
swrap_bind_symbol_libsocket(pipe);
|
swrap_bind_symbol_libsocket(pipe);
|
||||||
@ -4568,6 +4636,7 @@ static FILE *swrap_fopen(const char *name, const char *mode)
|
|||||||
return fp;
|
return fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef fopen /* Needed for LFS handling */
|
||||||
FILE *fopen(const char *name, const char *mode)
|
FILE *fopen(const char *name, const char *mode)
|
||||||
{
|
{
|
||||||
return swrap_fopen(name, mode);
|
return swrap_fopen(name, mode);
|
||||||
@ -4619,6 +4688,7 @@ static int swrap_vopen(const char *pathname, int flags, va_list ap)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef open /* Needed for LFS handling */
|
||||||
int open(const char *pathname, int flags, ...)
|
int open(const char *pathname, int flags, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -4666,6 +4736,42 @@ int open64(const char *pathname, int flags, ...)
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_OPEN64 */
|
#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
|
* OPENAT
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
@ -4688,6 +4794,7 @@ static int swrap_vopenat(int dirfd, const char *path, int flags, va_list ap)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef openat /* Needed for LFS handling */
|
||||||
int openat(int dirfd, const char *path, int flags, ...)
|
int openat(int dirfd, const char *path, int flags, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -8412,6 +8519,7 @@ static int swrap_vfcntl(int fd, int cmd, va_list va)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef fcntl /* Needed for LFS handling */
|
||||||
int fcntl(int fd, int cmd, ...)
|
int fcntl(int fd, int cmd, ...)
|
||||||
{
|
{
|
||||||
va_list va;
|
va_list va;
|
||||||
@ -8426,6 +8534,80 @@ int fcntl(int fd, int cmd, ...)
|
|||||||
return rc;
|
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
|
* EVENTFD
|
||||||
***************************/
|
***************************/
|
||||||
|
7
third_party/socket_wrapper/wscript
vendored
7
third_party/socket_wrapper/wscript
vendored
@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
VERSION="1.4.0"
|
VERSION = "1.4.2"
|
||||||
|
|
||||||
|
|
||||||
def configure(conf):
|
def configure(conf):
|
||||||
if conf.CHECK_SOCKET_WRAPPER():
|
if conf.CHECK_SOCKET_WRAPPER():
|
||||||
@ -55,6 +56,10 @@ def configure(conf):
|
|||||||
conf.CHECK_FUNCS('accept4')
|
conf.CHECK_FUNCS('accept4')
|
||||||
conf.CHECK_FUNCS('sendmmsg recvmmsg')
|
conf.CHECK_FUNCS('sendmmsg recvmmsg')
|
||||||
conf.CHECK_FUNCS('__close_nocancel')
|
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',
|
conf.CHECK_FUNCS_IN('bind',
|
||||||
'socket',
|
'socket',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user