[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Wed Jan 18 12:48:01 UTC 2023


The branch, master has been updated
       via  25aa870fed5 third_party: Update uid_wrapper to version 1.3.0
       via  77110bc9e8a third_party: Update socket_wrapper to version 1.4.0
       via  35ee3e0231a ctdb: Fix the build on FreeBSD
       via  99de0cf6ff0 smbd: Modernize DBG statements in smbXsrv_open_global_store()
       via  c6f1e3a6a20 smbd: Make smbXsrv_open_global_id_to_key() a bit more type-safe
       via  824b54174d8 smbd: Directly initialize key in smbXsrv_open_global_fetch_locked()
       via  6deee159f1d smbd: Remove unused smbXsrv_open_global_key_to_id()
       via  a39a3400ba6 smbd: Slightly simplify smbXsrv_open_create()
       via  b88db811db9 smbd: Remove smbXsrv_open_global_destructor()
       via  d55880d93dc smbd: Slightly simplify smb2srv_open_recreate()
      from  8fbadada8c0 lib/tsocket: fix a typo in the tsocket guide doc

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 25aa870fed548805a8cf64037a01ce0c87c6a01f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 16 22:14:03 2023 +0100

    third_party: Update uid_wrapper to version 1.3.0
    
    This is mainly needed in order to have some interaction
    with socket_wrapper 1.4.0 regarding the implementation
    of syscall().
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Wed Jan 18 12:47:48 UTC 2023 on sn-devel-184

commit 77110bc9e8a09ebefaa42eb4fd3a7449373fec9a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Jan 16 22:13:35 2023 +0100

    third_party: Update socket_wrapper to version 1.4.0
    
    The key feature is support for sendmmsg and recvmmsg,
    which is required by modern libuv versions, e.g.
    nsupdate -g makes use of libuv, so we need this for samba.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 35ee3e0231ac95cc81dee32eb8efd97e0c3016f9
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 18 08:59:17 2023 +0100

    ctdb: Fix the build on FreeBSD
    
    "basename" is define in libgen.h included from system/dir.h
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 99de0cf6ff085476191d6f3e63327c5068a233f8
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 5 16:06:40 2023 +0100

    smbd: Modernize DBG statements in smbXsrv_open_global_store()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit c6f1e3a6a201429e1c9abf027b7abd7eb8fe2f1b
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 4 20:09:32 2023 +0100

    smbd: Make smbXsrv_open_global_id_to_key() a bit more type-safe
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 824b54174d842a2e9e7a0f5f60998b478b6d82f2
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 11 14:07:42 2023 +0100

    smbd: Directly initialize key in smbXsrv_open_global_fetch_locked()
    
    Don't leave the key.dptr pointer uninitialized
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 6deee159f1d7fd4876f774d435998d16b89da37d
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 4 16:50:01 2023 +0100

    smbd: Remove unused smbXsrv_open_global_key_to_id()
    
    This isn't exactly rocket science we would need to keep around
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit a39a3400ba65b4357d3608d2e423576d2b6ed1e3
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 4 14:30:28 2023 +0100

    smbd: Slightly simplify smbXsrv_open_create()
    
    Move allocation of smbXsrv_open_global0 out of
    smbXsrv_open_global_allocate()
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit b88db811db9d2c12838e7ca33352b68abf7c64ad
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 11 14:01:29 2023 +0100

    smbd: Remove smbXsrv_open_global_destructor()
    
    This did not do much.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit d55880d93dc46bf09b4de1a848a1c46e5de2302d
Author: Volker Lendecke <vl at samba.org>
Date:   Wed Jan 4 14:05:55 2023 +0100

    smbd: Slightly simplify smb2srv_open_recreate()
    
    This moves the bit-fiddling right next to the check we do,
    "global_zeros" was only used for this one purpose and its assignment
    was a few lines away.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 ctdb/server/ctdb_mutex_fcntl_helper.c       |   1 +
 source3/smbd/smbXsrv_open.c                 | 120 ++--
 third_party/socket_wrapper/socket_wrapper.c | 887 +++++++++++++++++++++++++++-
 third_party/socket_wrapper/wscript          |  14 +
 third_party/uid_wrapper/uid_wrapper.c       | 600 ++++++++++++++++---
 5 files changed, 1454 insertions(+), 168 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/server/ctdb_mutex_fcntl_helper.c b/ctdb/server/ctdb_mutex_fcntl_helper.c
index 84d3790db57..aac98eaeead 100644
--- a/ctdb/server/ctdb_mutex_fcntl_helper.c
+++ b/ctdb/server/ctdb_mutex_fcntl_helper.c
@@ -25,6 +25,7 @@
 #include "system/filesys.h"
 #include "system/network.h"
 #include "system/wait.h"
+#include "system/dir.h"
 
 #include <tevent.h>
 
diff --git a/source3/smbd/smbXsrv_open.c b/source3/smbd/smbXsrv_open.c
index c67556545be..6aa44ec4fcc 100644
--- a/source3/smbd/smbXsrv_open.c
+++ b/source3/smbd/smbXsrv_open.c
@@ -94,47 +94,28 @@ NTSTATUS smbXsrv_open_global_init(void)
  * TODO: implement string based key
  */
 
-#define SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE sizeof(uint32_t)
+struct smbXsrv_open_global_key_buf { uint8_t buf[sizeof(uint32_t)]; };
 
-static TDB_DATA smbXsrv_open_global_id_to_key(uint32_t id,
-					      uint8_t *key_buf)
+static TDB_DATA smbXsrv_open_global_id_to_key(
+	uint32_t id, struct smbXsrv_open_global_key_buf *key_buf)
 {
-	TDB_DATA key;
-
-	RSIVAL(key_buf, 0, id);
-
-	key = make_tdb_data(key_buf, SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE);
-
-	return key;
-}
-
-#if 0
-static NTSTATUS smbXsrv_open_global_key_to_id(TDB_DATA key, uint32_t *id)
-{
-	if (id == NULL) {
-		return NT_STATUS_INVALID_PARAMETER;
-	}
-
-	if (key.dsize != SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE) {
-		return NT_STATUS_INTERNAL_DB_CORRUPTION;
-	}
+	RSIVAL(key_buf->buf, 0, id);
 
-	*id = RIVAL(key.dptr, 0);
-
-	return NT_STATUS_OK;
+	return (TDB_DATA) {
+		.dptr = key_buf->buf,
+		.dsize = sizeof(key_buf->buf),
+	};
 }
-#endif
 
 static struct db_record *smbXsrv_open_global_fetch_locked(
 			struct db_context *db,
 			uint32_t id,
 			TALLOC_CTX *mem_ctx)
 {
-	TDB_DATA key;
-	uint8_t key_buf[SMBXSRV_OPEN_GLOBAL_TDB_KEY_SIZE];
+	struct smbXsrv_open_global_key_buf key_buf;
+	TDB_DATA key = smbXsrv_open_global_id_to_key(id, &key_buf);
 	struct db_record *rec = NULL;
 
-	key = smbXsrv_open_global_id_to_key(id, key_buf);
 
 	rec = dbwrap_fetch_locked(db, mem_ctx, key);
 
@@ -244,41 +225,19 @@ static NTSTATUS smbXsrv_open_local_lookup(struct smbXsrv_open_table *table,
 	return NT_STATUS_OK;
 }
 
-static int smbXsrv_open_global_destructor(struct smbXsrv_open_global0 *global)
-{
-	return 0;
-}
-
 static void smbXsrv_open_global_verify_record(struct db_record *db_rec,
 					bool *is_free,
 					bool *was_free,
 					TALLOC_CTX *mem_ctx,
 					struct smbXsrv_open_global0 **_g);
 
-static NTSTATUS smbXsrv_open_global_allocate(struct db_context *db,
-					TALLOC_CTX *mem_ctx,
-					struct smbXsrv_open_global0 **_global)
+static NTSTATUS smbXsrv_open_global_allocate(
+	struct db_context *db, struct smbXsrv_open_global0 *global)
 {
 	uint32_t i;
-	struct smbXsrv_open_global0 *global = NULL;
 	uint32_t last_free = 0;
 	const uint32_t min_tries = 3;
 
-	*_global = NULL;
-
-	global = talloc_zero(mem_ctx, struct smbXsrv_open_global0);
-	if (global == NULL) {
-		return NT_STATUS_NO_MEMORY;
-	}
-	talloc_set_destructor(global, smbXsrv_open_global_destructor);
-
-	/*
-	 * We mark every slot as invalid using 0xFF.
-	 * Valid values are masked with 0xF.
-	 */
-	memset(global->lock_sequence_array, 0xFF,
-	       sizeof(global->lock_sequence_array));
-
 	/*
 	 * Here we just randomly try the whole 32-bit space
 	 *
@@ -302,9 +261,9 @@ static NTSTATUS smbXsrv_open_global_allocate(struct db_context *db,
 			id--;
 		}
 
-		global->db_rec = smbXsrv_open_global_fetch_locked(db, id, mem_ctx);
+		global->db_rec = smbXsrv_open_global_fetch_locked(
+			db, id, global);
 		if (global->db_rec == NULL) {
-			talloc_free(global);
 			return NT_STATUS_INSUFFICIENT_RESOURCES;
 		}
 
@@ -338,12 +297,10 @@ static NTSTATUS smbXsrv_open_global_allocate(struct db_context *db,
 
 		global->open_global_id = id;
 
-		*_global = global;
 		return NT_STATUS_OK;
 	}
 
 	/* should not be reached */
-	talloc_free(global);
 	return NT_STATUS_INTERNAL_ERROR;
 }
 
@@ -472,28 +429,26 @@ static NTSTATUS smbXsrv_open_global_store(struct smbXsrv_open_global0 *global)
 	ndr_err = ndr_push_struct_blob(&blob, talloc_tos(), &global_blob,
 			(ndr_push_flags_fn_t)ndr_push_smbXsrv_open_globalB);
 	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-		status = ndr_map_error2ntstatus(ndr_err);
-		DEBUG(1,("smbXsrv_open_global_store: key '%s' ndr_push - %s\n",
-			 tdb_data_dbg(key),
-			 nt_errstr(status)));
+		DBG_WARNING("key '%s' ndr_push - %s\n",
+			    tdb_data_dbg(key),
+			    ndr_map_error2string(ndr_err));
 		TALLOC_FREE(global->db_rec);
-		return status;
+		return ndr_map_error2ntstatus(ndr_err);
 	}
 
 	val = make_tdb_data(blob.data, blob.length);
 	status = dbwrap_record_store(global->db_rec, val, TDB_REPLACE);
 	TALLOC_FREE(blob.data);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(1,("smbXsrv_open_global_store: key '%s' store - %s\n",
-			 tdb_data_dbg(key),
-			 nt_errstr(status)));
+		DBG_WARNING("key '%s' store - %s\n",
+			    tdb_data_dbg(key),
+			    nt_errstr(status));
 		TALLOC_FREE(global->db_rec);
 		return status;
 	}
 
 	if (CHECK_DEBUGLVL(10)) {
-		DEBUG(10,("smbXsrv_open_global_store: key '%s' stored\n",
-			  tdb_data_dbg(key)));
+		DBG_DEBUG("key '%s' stored\n", tdb_data_dbg(key));
 		NDR_PRINT_DEBUG(smbXsrv_open_globalB, &global_blob);
 	}
 
@@ -536,8 +491,6 @@ static NTSTATUS smbXsrv_open_global_lookup(struct smbXsrv_open_table *table,
 
 	(*_global)->db_rec = talloc_move(*_global, &global_rec);
 
-	talloc_set_destructor(*_global, smbXsrv_open_global_destructor);
-
 	return NT_STATUS_OK;
 }
 
@@ -599,13 +552,25 @@ NTSTATUS smbXsrv_open_create(struct smbXsrv_connection *conn,
 	op->status = NT_STATUS_OK; /* TODO: start with INTERNAL_ERROR */
 	op->idle_time = now;
 
-	status = smbXsrv_open_global_allocate(table->global.db_ctx,
-					      op, &global);
+	global = talloc_zero(op, struct smbXsrv_open_global0);
+	if (global == NULL) {
+		TALLOC_FREE(op);
+		return NT_STATUS_NO_MEMORY;
+	}
+	op->global = global;
+
+	/*
+	 * We mark every slot as invalid using 0xFF.
+	 * Valid values are masked with 0xF.
+	 */
+	memset(global->lock_sequence_array, 0xFF,
+	       sizeof(global->lock_sequence_array));
+
+	status = smbXsrv_open_global_allocate(table->global.db_ctx, global);
 	if (!NT_STATUS_IS_OK(status)) {
 		TALLOC_FREE(op);
 		return status;
 	}
-	op->global = global;
 
 	local_id = idr_get_new_random(
 		table->local.idr,
@@ -1211,8 +1176,7 @@ NTSTATUS smb2srv_open_recreate(struct smbXsrv_connection *conn,
 {
 	struct smbXsrv_open_table *table = conn->client->open_table;
 	struct smbXsrv_open *op = NULL;
-	uint32_t global_id = persistent_id & UINT32_MAX;
-	uint64_t global_zeros = persistent_id & 0xFFFFFFFF00000000LLU;
+	uint32_t global_id;
 	NTSTATUS status;
 	struct security_token *current_token = NULL;
 	int local_id;
@@ -1228,10 +1192,14 @@ NTSTATUS smb2srv_open_recreate(struct smbXsrv_connection *conn,
 		return NT_STATUS_INVALID_HANDLE;
 	}
 
-	if (global_zeros != 0) {
-		DEBUG(10, ("global_zeros!=0\n"));
+	if ((persistent_id & 0xFFFFFFFF00000000LLU) != 0) {
+		/*
+		 * We only use 32 bit for the persistent ID
+		 */
+		DBG_DEBUG("persistent_id=%"PRIx64"\n", persistent_id);
 		return NT_STATUS_OBJECT_NAME_NOT_FOUND;
 	}
+	global_id = persistent_id & UINT32_MAX; /* truncate to 32 bit */
 
 	op = talloc_zero(table, struct smbXsrv_open);
 	if (op == NULL) {
diff --git a/third_party/socket_wrapper/socket_wrapper.c b/third_party/socket_wrapper/socket_wrapper.c
index bedda07a72b..bf4a976eaee 100644
--- a/third_party/socket_wrapper/socket_wrapper.c
+++ b/third_party/socket_wrapper/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


-- 
Samba Shared Repository



More information about the samba-cvs mailing list