[SCM] Socket Wrapper Repository - branch master updated
Andreas Schneider
asn at samba.org
Tue Feb 2 09:25:02 UTC 2021
The branch, master has been updated
via f69ed59 swrap: add basic support for fd-passing via SCM_RIGHTS
via 66a5bef tests: Add test for socket_wrapper fd-passing support
via 650115f swrap: always check new fd's against socket_fds_max and use libc_close() for cleanup
via a79dec9 swrap: add const to swrap_add_socket_info()
via c740bbe swrap: let swrap_sendmsg_before_unix() create a copy of msg_tmp.msg_control
via de81995 swrap: add stubs for swrap_{sendmsg,recvmsg}_{before,after}_unix()
via e030a18 swrap: filter out SCM_{RIGHTS,CREDENTIALS} on inet socket
via 00f61ed swrap: add error checking/cleanup to swrap_sendmsg_filter_cmsghdr()
via 00650ff swrap: Fix MSGHDR check in sendmsg()
via 5b2a982 swrap: print out SOCKET_WRAPPER_PACKAGE and SOCKET_WRAPPER_VERSION on first use
from ef90a76 src/socket_wrapper.c: Improve checks and debug output of socket_wrapper_dir()
https://git.samba.org/?p=socket_wrapper.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit f69ed59e64acac52c1f8b3f8c7a76c5db0bc5877
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jun 29 14:10:54 2020 +0200
swrap: add basic support for fd-passing via SCM_RIGHTS
We only allow passing up to 6 fds in a single sendmsg call,
in order to keep the logic simple.
That's more than enough for Samba's use of fd-passing,
there we only pass a single fd and the fd will be
closed in the sender on success. It means it's ok
to keep the socket_info.io.pck_{snd,rcv} fields per process
and the PCAP generation will still work as expected.
If these constraints turn out to be a problem for other applications,
we need to change to a more complex design and move the socket_info array
into a shared memory file and use shared robust mutexes.
But for now we just want to support multi-channel testing in Samba.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11899
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 66a5bef7f9aac4d70124bc8efec72dcd434c660a
Author: Anoop C S <anoopcs at samba.org>
Date: Thu Jul 23 15:59:29 2020 +0530
tests: Add test for socket_wrapper fd-passing support
Signed-off-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 650115f1b4ed2fd4aa7d65ce7578bc919e0601f4
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Jun 30 17:53:20 2020 +0200
swrap: always check new fd's against socket_fds_max and use libc_close() for cleanup
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit a79dec9866a0c42ff60c72ba04483818d4575127
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue Jun 30 17:51:29 2020 +0200
swrap: add const to swrap_add_socket_info()
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit c740bbe30affb7b94c6cca5f65a4e9047a1119ec
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jun 29 09:39:22 2020 +0200
swrap: let swrap_sendmsg_before_unix() create a copy of msg_tmp.msg_control
With fd-passing we'll have to modify the content of it.
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit de819958b00b48f285a1f31bfee1f8bee8e16827
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jun 29 09:27:24 2020 +0200
swrap: add stubs for swrap_{sendmsg,recvmsg}_{before,after}_unix()
In order to implement fd-passing of socket_wrapper simulated sockets
we need to modify the msghdr structures from the callers.
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit e030a1897873f3cb24e7d5a35adab421a9d11b9f
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jun 29 13:07:26 2020 +0200
swrap: filter out SCM_{RIGHTS,CREDENTIALS} on inet socket
These are only valid on unix domain sockets and ignored otherwise (at
least on Linux).
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 00f61edc7363cd17435b559beb04b567200fb38f
Author: Stefan Metzmacher <metze at samba.org>
Date: Mon Jun 29 10:12:07 2020 +0200
swrap: add error checking/cleanup to swrap_sendmsg_filter_cmsghdr()
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 00650ffb0b913010aab7a004fa2d3eadf2f2f007
Author: Anoop C S <anoopcs at redhat.com>
Date: Wed May 22 10:45:37 2019 +0530
swrap: Fix MSGHDR check in sendmsg()
Check for msg_controllen and msg_control data members from msghdr
structure needs to be validated on the received omsg pointer rather
than on newly created msghdr struture inside the wrapper.
Signed-off-by: Anoop C S <anoopcs at redhat.com>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
commit 5b2a98203bbb0230785a65429338b52bd377971b
Author: Stefan Metzmacher <metze at samba.org>
Date: Thu Jan 28 12:40:14 2021 +0100
swrap: print out SOCKET_WRAPPER_PACKAGE and SOCKET_WRAPPER_VERSION on first use
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Reviewed-by: Anoop C S <anoopcs at samba.org>
Reviewed-by: Andreas Schneider <asn at samba.org>
-----------------------------------------------------------------------
Summary of changes:
ConfigureChecks.cmake | 4 +-
config.h.cmake | 4 +-
doc/socket_wrapper.1 | 15 +-
doc/socket_wrapper.1.txt | 5 +-
src/socket_wrapper.c | 1042 ++++++++++++++++++++++++++++--
tests/CMakeLists.txt | 2 +-
tests/test_echo_tcp_sendmsg_recvmsg_fd.c | 188 ++++++
7 files changed, 1196 insertions(+), 64 deletions(-)
create mode 100644 tests/test_echo_tcp_sendmsg_recvmsg_fd.c
Changeset truncated at 500 lines:
diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 3c8e615..bfb8c17 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -7,8 +7,8 @@ include(CheckStructHasMember)
include(CheckPrototypeDefinition)
include(TestBigEndian)
-set(PACKAGE ${PROJECT_NAME})
-set(VERSION ${PROJECT_VERSION})
+set(SOCKET_WRAPPER_PACKAGE ${PROJECT_NAME})
+set(SOCKET_WRAPPER_VERSION ${PROJECT_VERSION})
set(BINARYDIR ${CMAKE_BINARY_DIR})
set(SOURCEDIR ${CMAKE_SOURCE_DIR})
diff --git a/config.h.cmake b/config.h.cmake
index 38166d2..1148f74 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -1,8 +1,8 @@
/* Name of package */
-#cmakedefine PACKAGE "${PROJECT_NAME}"
+#cmakedefine SOCKET_WRAPPER_PACKAGE "${SOCKET_WRAPPER_PACKAGE}"
/* Version number of package */
-#cmakedefine VERSION "${PROJECT_VERSION}"
+#cmakedefine SOCKET_WRAPPER_VERSION "${SOCKET_WRAPPER_VERSION}"
#cmakedefine BINARYDIR "${BINARYDIR}"
#cmakedefine SOURCEDIR "${SOURCEDIR}"
diff --git a/doc/socket_wrapper.1 b/doc/socket_wrapper.1
index ec7f4b8..3bd171e 100644
--- a/doc/socket_wrapper.1
+++ b/doc/socket_wrapper.1
@@ -2,12 +2,12 @@
.\" Title: socket_wrapper
.\" Author: Samba Team
.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
-.\" Date: 2018-11-28
+.\" Date: 2021-02-01
.\" Manual: \ \&
.\" Source: \ \&
.\" Language: English
.\"
-.TH "SOCKET_WRAPPER" "1" "2018\-11\-28" "\ \&" "\ \&"
+.TH "SOCKET_WRAPPER" "1" "2021\-02\-01" "\ \&" "\ \&"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -68,6 +68,17 @@ Support for IPv4 and IPv6 socket and addressing emulation\&.
.\}
Ability to capture network traffic in pcap format\&.
.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Passing IP sockets (up to 6) via SCM_RIGHTS is supported, but pcap support only works reliable if the socket is used by a single process at a time\&.
+.RE
.SH "ENVIRONMENT VARIABLES"
.PP
\fBSOCKET_WRAPPER_DIR\fR
diff --git a/doc/socket_wrapper.1.txt b/doc/socket_wrapper.1.txt
index d070fbf..425b08f 100644
--- a/doc/socket_wrapper.1.txt
+++ b/doc/socket_wrapper.1.txt
@@ -1,6 +1,6 @@
socket_wrapper(1)
=================
-:revdate: 2018-11-28
+:revdate: 2021-02-01
:author: Samba Team
NAME
@@ -24,6 +24,9 @@ testing of complex network configurations.
- Redirects all network communication to happen over Unix sockets.
- Support for IPv4 and IPv6 socket and addressing emulation.
- Ability to capture network traffic in pcap format.
+- Passing IP sockets (up to 6) via SCM_RIGHTS is supported,
+ but pcap support only works reliable if the socket is used
+ by a single process at a time.
ENVIRONMENT VARIABLES
---------------------
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 89454ca..14d0dda 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -302,6 +302,11 @@ static int first_free;
struct socket_info
{
+ /*
+ * Remember to update swrap_unix_scm_right_magic
+ * on any change.
+ */
+
int family;
int type;
int protocol;
@@ -313,6 +318,7 @@ struct socket_info
int pktinfo;
int tcp_nodelay;
int listening;
+ int fd_passed;
/* The unix path so we can unlink it on close() */
struct sockaddr_un un_addr;
@@ -1672,6 +1678,10 @@ static void socket_wrapper_init_sockets(void)
return;
}
+ SWRAP_LOG(SWRAP_LOG_DEBUG,
+ "SOCKET_WRAPPER_PACKAGE[%s] SOCKET_WRAPPER_VERSION[%s]",
+ SOCKET_WRAPPER_PACKAGE, SOCKET_WRAPPER_VERSION);
+
/*
* Intialize the static cache early before
* any thread is able to start.
@@ -1807,7 +1817,7 @@ static int find_socket_info_index(int fd)
return socket_fds_idx[fd];
}
-static int swrap_add_socket_info(struct socket_info *si_input)
+static int swrap_add_socket_info(const struct socket_info *si_input)
{
struct socket_info *si = NULL;
int si_index = -1;
@@ -1850,6 +1860,7 @@ static int swrap_create_socket(struct socket_info *si, int fd)
"trying to add %d",
socket_fds_max,
fd);
+ errno = EMFILE;
return -1;
}
@@ -2960,7 +2971,7 @@ static int swrap_pcap_get_fd(const char *fname)
file_hdr.link_type = 0x0065; /* 101 RAW IP */
if (write(fd, &file_hdr, sizeof(file_hdr)) != sizeof(file_hdr)) {
- close(fd);
+ libc_close(fd);
fd = -1;
}
return fd;
@@ -3465,6 +3476,9 @@ static int swrap_socket(int family, int type, int protocol)
ret = swrap_create_socket(si, fd);
if (ret == -1) {
+ int saved_errno = errno;
+ libc_close(fd);
+ errno = saved_errno;
return -1;
}
@@ -3635,7 +3649,7 @@ static int swrap_accept(int s,
&in_addr.sa_socklen);
if (ret == -1) {
SWRAP_UNLOCK_SI(parent_si);
- close(fd);
+ libc_close(fd);
return ret;
}
@@ -3667,7 +3681,7 @@ static int swrap_accept(int s,
&un_my_addr.sa.s,
&un_my_addr.sa_socklen);
if (ret == -1) {
- close(fd);
+ libc_close(fd);
return ret;
}
@@ -3678,7 +3692,7 @@ static int swrap_accept(int s,
&in_my_addr.sa.s,
&in_my_addr.sa_socklen);
if (ret == -1) {
- close(fd);
+ libc_close(fd);
return ret;
}
@@ -3693,7 +3707,9 @@ static int swrap_accept(int s,
idx = swrap_create_socket(&new_si, fd);
if (idx == -1) {
- close (fd);
+ int saved_errno = errno;
+ libc_close(fd);
+ errno = saved_errno;
return -1;
}
@@ -4987,16 +5003,21 @@ static int swrap_msghdr_add_socket_info(struct socket_info *si,
return rc;
}
-static int swrap_sendmsg_copy_cmsg(struct cmsghdr *cmsg,
+static int swrap_sendmsg_copy_cmsg(const struct cmsghdr *cmsg,
uint8_t **cm_data,
size_t *cm_data_space);
-static int swrap_sendmsg_filter_cmsg_socket(struct cmsghdr *cmsg,
- uint8_t **cm_data,
- size_t *cm_data_space);
-
-static int swrap_sendmsg_filter_cmsghdr(struct msghdr *msg,
+static int swrap_sendmsg_filter_cmsg_ipproto_ip(const struct cmsghdr *cmsg,
+ uint8_t **cm_data,
+ size_t *cm_data_space);
+static int swrap_sendmsg_filter_cmsg_sol_socket(const struct cmsghdr *cmsg,
+ uint8_t **cm_data,
+ size_t *cm_data_space);
+
+static int swrap_sendmsg_filter_cmsghdr(const struct msghdr *_msg,
uint8_t **cm_data,
- size_t *cm_data_space) {
+ size_t *cm_data_space)
+{
+ struct msghdr *msg = discard_const_p(struct msghdr, _msg);
struct cmsghdr *cmsg;
int rc = -1;
@@ -5010,9 +5031,14 @@ static int swrap_sendmsg_filter_cmsghdr(struct msghdr *msg,
cmsg = CMSG_NXTHDR(msg, cmsg)) {
switch (cmsg->cmsg_level) {
case IPPROTO_IP:
- rc = swrap_sendmsg_filter_cmsg_socket(cmsg,
- cm_data,
- cm_data_space);
+ rc = swrap_sendmsg_filter_cmsg_ipproto_ip(cmsg,
+ cm_data,
+ cm_data_space);
+ break;
+ case SOL_SOCKET:
+ rc = swrap_sendmsg_filter_cmsg_sol_socket(cmsg,
+ cm_data,
+ cm_data_space);
break;
default:
rc = swrap_sendmsg_copy_cmsg(cmsg,
@@ -5020,12 +5046,19 @@ static int swrap_sendmsg_filter_cmsghdr(struct msghdr *msg,
cm_data_space);
break;
}
+ if (rc < 0) {
+ int saved_errno = errno;
+ SAFE_FREE(*cm_data);
+ *cm_data_space = 0;
+ errno = saved_errno;
+ return rc;
+ }
}
return rc;
}
-static int swrap_sendmsg_copy_cmsg(struct cmsghdr *cmsg,
+static int swrap_sendmsg_copy_cmsg(const struct cmsghdr *cmsg,
uint8_t **cm_data,
size_t *cm_data_space)
{
@@ -5048,14 +5081,14 @@ static int swrap_sendmsg_copy_cmsg(struct cmsghdr *cmsg,
return 0;
}
-static int swrap_sendmsg_filter_cmsg_pktinfo(struct cmsghdr *cmsg,
+static int swrap_sendmsg_filter_cmsg_pktinfo(const struct cmsghdr *cmsg,
uint8_t **cm_data,
size_t *cm_data_space);
-static int swrap_sendmsg_filter_cmsg_socket(struct cmsghdr *cmsg,
- uint8_t **cm_data,
- size_t *cm_data_space)
+static int swrap_sendmsg_filter_cmsg_ipproto_ip(const struct cmsghdr *cmsg,
+ uint8_t **cm_data,
+ size_t *cm_data_space)
{
int rc = -1;
@@ -5081,7 +5114,7 @@ static int swrap_sendmsg_filter_cmsg_socket(struct cmsghdr *cmsg,
return rc;
}
-static int swrap_sendmsg_filter_cmsg_pktinfo(struct cmsghdr *cmsg,
+static int swrap_sendmsg_filter_cmsg_pktinfo(const struct cmsghdr *cmsg,
uint8_t **cm_data,
size_t *cm_data_space)
{
@@ -5095,7 +5128,832 @@ static int swrap_sendmsg_filter_cmsg_pktinfo(struct cmsghdr *cmsg,
*/
return 0;
}
+
+static int swrap_sendmsg_filter_cmsg_sol_socket(const struct cmsghdr *cmsg,
+ uint8_t **cm_data,
+ size_t *cm_data_space)
+{
+ int rc = -1;
+
+ switch (cmsg->cmsg_type) {
+ case SCM_RIGHTS:
+ SWRAP_LOG(SWRAP_LOG_TRACE,
+ "Ignoring SCM_RIGHTS on inet socket!");
+ rc = 0;
+ break;
+#ifdef SCM_CREDENTIALS
+ case SCM_CREDENTIALS:
+ SWRAP_LOG(SWRAP_LOG_TRACE,
+ "Ignoring SCM_CREDENTIALS on inet socket!");
+ rc = 0;
+ break;
+#endif /* SCM_CREDENTIALS */
+ default:
+ rc = swrap_sendmsg_copy_cmsg(cmsg,
+ cm_data,
+ cm_data_space);
+ break;
+ }
+
+ return rc;
+}
+
+static const uint64_t swrap_unix_scm_right_magic = 0x8e0e13f27c42fc36;
+
+/*
+ * We only allow up to 6 fds at a time
+ * as that's more than enough for Samba
+ * and it means we can keep the logic simple
+ * and work with fixed size arrays.
+ *
+ * We also keep sizeof(struct swrap_unix_scm_rights)
+ * under PIPE_BUF (4096) in order to allow a non-blocking
+ * write into the pipe.
+ */
+#ifndef PIPE_BUF
+#define PIPE_BUF 4096
+#endif
+#define SWRAP_MAX_PASSED_FDS ((size_t)6)
+#define SWRAP_MAX_PASSED_SOCKET_INFO SWRAP_MAX_PASSED_FDS
+struct swrap_unix_scm_rights_payload {
+ uint8_t num_idxs;
+ int8_t idxs[SWRAP_MAX_PASSED_FDS];
+ struct socket_info infos[SWRAP_MAX_PASSED_SOCKET_INFO];
+};
+struct swrap_unix_scm_rights {
+ uint64_t magic;
+ char package_name[sizeof(SOCKET_WRAPPER_PACKAGE)];
+ char package_version[sizeof(SOCKET_WRAPPER_VERSION)];
+ uint32_t full_size;
+ uint32_t payload_size;
+ struct swrap_unix_scm_rights_payload payload;
+};
+
+static void swrap_dec_fd_passed_array(size_t num, struct socket_info **array)
+{
+ int saved_errno = errno;
+ size_t i;
+
+ for (i = 0; i < num; i++) {
+ struct socket_info *si = array[i];
+ if (si == NULL) {
+ continue;
+ }
+
+ SWRAP_LOCK_SI(si);
+ swrap_dec_refcount(si);
+ if (si->fd_passed > 0) {
+ si->fd_passed -= 1;
+ }
+ SWRAP_UNLOCK_SI(si);
+ array[i] = NULL;
+ }
+
+ errno = saved_errno;
+}
+
+static void swrap_undo_si_idx_array(size_t num, int *array)
+{
+ int saved_errno = errno;
+ size_t i;
+
+ swrap_mutex_lock(&first_free_mutex);
+
+ for (i = 0; i < num; i++) {
+ struct socket_info *si = NULL;
+
+ if (array[i] == -1) {
+ continue;
+ }
+
+ si = swrap_get_socket_info(array[i]);
+ if (si == NULL) {
+ continue;
+ }
+
+ SWRAP_LOCK_SI(si);
+ swrap_dec_refcount(si);
+ SWRAP_UNLOCK_SI(si);
+
+ swrap_set_next_free(si, first_free);
+ first_free = array[i];
+ array[i] = -1;
+ }
+
+ swrap_mutex_unlock(&first_free_mutex);
+ errno = saved_errno;
+}
+
+static void swrap_close_fd_array(size_t num, const int *array)
+{
+ int saved_errno = errno;
+ size_t i;
+
+ for (i = 0; i < num; i++) {
+ if (array[i] == -1) {
+ continue;
+ }
+ libc_close(array[i]);
+ }
+
+ errno = saved_errno;
+}
+
+union __swrap_fds {
+ const uint8_t *p;
+ int *fds;
+};
+
+union __swrap_cmsghdr {
+ const uint8_t *p;
+ struct cmsghdr *cmsg;
+};
+
+static int swrap_sendmsg_unix_scm_rights(const struct cmsghdr *cmsg,
+ uint8_t **cm_data,
+ size_t *cm_data_space,
+ int *scm_rights_pipe_fd)
+{
+ struct swrap_unix_scm_rights info;
+ struct swrap_unix_scm_rights_payload *payload = NULL;
+ int si_idx_array[SWRAP_MAX_PASSED_FDS];
+ struct socket_info *si_array[SWRAP_MAX_PASSED_FDS] = { NULL, };
+ size_t info_idx = 0;
+ size_t size_fds_in;
+ size_t num_fds_in;
+ union __swrap_fds __fds_in = { .p = NULL, };
+ const int *fds_in = NULL;
+ size_t num_fds_out;
+ size_t size_fds_out;
+ union __swrap_fds __fds_out = { .p = NULL, };
+ int *fds_out = NULL;
+ size_t cmsg_len;
+ size_t cmsg_space;
+ size_t new_cm_data_space;
+ union __swrap_cmsghdr __new_cmsg = { .p = NULL, };
+ struct cmsghdr *new_cmsg = NULL;
+ uint8_t *p = NULL;
+ size_t i;
+ int pipefd[2] = { -1, -1 };
+ int rc;
+ ssize_t sret;
+
+ /*
+ * We pass this a buffer to the kernel make sure any padding
+ * is also cleared.
+ */
+ ZERO_STRUCT(info);
+ info.magic = swrap_unix_scm_right_magic;
+ memcpy(info.package_name,
+ SOCKET_WRAPPER_PACKAGE,
+ sizeof(info.package_name));
+ memcpy(info.package_version,
+ SOCKET_WRAPPER_VERSION,
+ sizeof(info.package_version));
+ info.full_size = sizeof(info);
+ info.payload_size = sizeof(info.payload);
+ payload = &info.payload;
+
+ if (*scm_rights_pipe_fd != -1) {
+ SWRAP_LOG(SWRAP_LOG_ERROR,
+ "Two SCM_RIGHTS headers are not supported by socket_wrapper");
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (cmsg->cmsg_len < CMSG_LEN(0)) {
+ SWRAP_LOG(SWRAP_LOG_ERROR,
+ "cmsg->cmsg_len=%zu < CMSG_LEN(0)=%zu",
+ (size_t)cmsg->cmsg_len,
+ CMSG_LEN(0));
+ errno = EINVAL;
+ return -1;
+ }
+ size_fds_in = cmsg->cmsg_len - CMSG_LEN(0);
--
Socket Wrapper Repository
More information about the samba-cvs
mailing list