svn commit: r339066 - stable/11/tools/regression/sockets/unix_cmsg
Maxim Sobolev
sobomax at FreeBSD.org
Mon Oct 1 17:26:45 UTC 2018
Author: sobomax
Date: Mon Oct 1 17:26:41 2018
New Revision: 339066
URL: https://svnweb.freebsd.org/changeset/base/339066
Log:
MFC r309554 and r309631 which breaks down overly long monolithic
souce file and reduces duplication by auto-generating functions
that only differ in the value of the SCM_XXX constant used.
This also fixes unintentional breakage introduced in earlier
MFC in r338617 that happens to rely on some of those changes.
Reported by: asomers
Pointy-hat goes to: sobomax
Added:
stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.c
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c
stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.h
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h
stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.c
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c
stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.h
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h
stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c
stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h
stable/11/tools/regression/sockets/unix_cmsg/t_generic.c
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.c
stable/11/tools/regression/sockets/unix_cmsg/t_generic.h
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.h
stable/11/tools/regression/sockets/unix_cmsg/t_peercred.c
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.c
stable/11/tools/regression/sockets/unix_cmsg/t_peercred.h
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.h
stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.c
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.c
stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.h
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.h
stable/11/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
- copied unchanged from r309631, head/tools/regression/sockets/unix_cmsg/t_xxxtime.c.in
stable/11/tools/regression/sockets/unix_cmsg/t_xxxtime.h.in
- copied unchanged from r309631, head/tools/regression/sockets/unix_cmsg/t_xxxtime.h.in
stable/11/tools/regression/sockets/unix_cmsg/uc_common.c
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/uc_common.c
stable/11/tools/regression/sockets/unix_cmsg/uc_common.h
- copied unchanged from r309554, head/tools/regression/sockets/unix_cmsg/uc_common.h
Modified:
stable/11/tools/regression/sockets/unix_cmsg/Makefile
stable/11/tools/regression/sockets/unix_cmsg/unix_cmsg.c
Modified: stable/11/tools/regression/sockets/unix_cmsg/Makefile
==============================================================================
--- stable/11/tools/regression/sockets/unix_cmsg/Makefile Mon Oct 1 16:23:00 2018 (r339065)
+++ stable/11/tools/regression/sockets/unix_cmsg/Makefile Mon Oct 1 17:26:41 2018 (r339066)
@@ -1,6 +1,11 @@
# $FreeBSD$
PROG= unix_cmsg
+SRCS= ${AUTOSRCS} unix_cmsg.c uc_common.h uc_common.c \
+ t_generic.h t_generic.c t_peercred.h t_peercred.c \
+ t_cmsgcred.h t_cmsgcred.c t_sockcred.h t_sockcred.c \
+ t_cmsgcred_sockcred.h t_cmsgcred_sockcred.c t_cmsg_len.h t_cmsg_len.c
+CLEANFILES+= ${AUTOSRCS}
MAN=
WARNS?= 3
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.c Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.c)
@@ -0,0 +1,138 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_cmsg_len.h"
+
+#ifndef __LP64__
+static int
+t_cmsg_len_client(int fd)
+{
+ struct msghdr msghdr;
+ struct iovec iov[1];
+ struct cmsghdr *cmsghdr;
+ void *cmsg_data;
+ size_t size, cmsg_size;
+ socklen_t socklen;
+ int rv;
+
+ if (uc_sync_recv() < 0)
+ return (-2);
+
+ rv = -2;
+
+ cmsg_size = CMSG_SPACE(sizeof(struct cmsgcred));
+ cmsg_data = malloc(cmsg_size);
+ if (cmsg_data == NULL) {
+ uc_logmsg("malloc");
+ goto done;
+ }
+ uc_msghdr_init_client(&msghdr, iov, cmsg_data, cmsg_size,
+ SCM_CREDS, sizeof(struct cmsgcred));
+ cmsghdr = CMSG_FIRSTHDR(&msghdr);
+
+ if (uc_socket_connect(fd) < 0)
+ goto done;
+
+ size = msghdr.msg_iov != NULL ? msghdr.msg_iov->iov_len : 0;
+ rv = -1;
+ for (socklen = 0; socklen < CMSG_LEN(0); ++socklen) {
+ cmsghdr->cmsg_len = socklen;
+ uc_dbgmsg("send: data size %zu", size);
+ uc_dbgmsg("send: msghdr.msg_controllen %u",
+ (u_int)msghdr.msg_controllen);
+ uc_dbgmsg("send: cmsghdr.cmsg_len %u",
+ (u_int)cmsghdr->cmsg_len);
+ if (sendmsg(fd, &msghdr, 0) < 0) {
+ uc_dbgmsg("sendmsg(2) failed: %s; retrying",
+ strerror(errno));
+ continue;
+ }
+ uc_logmsgx("sent message with cmsghdr.cmsg_len %u < %u",
+ (u_int)cmsghdr->cmsg_len, (u_int)CMSG_LEN(0));
+ break;
+ }
+ if (socklen == CMSG_LEN(0))
+ rv = 0;
+
+ if (uc_sync_send() < 0) {
+ rv = -2;
+ goto done;
+ }
+done:
+ free(cmsg_data);
+ return (rv);
+}
+
+static int
+t_cmsg_len_server(int fd1)
+{
+ int fd2, rv;
+
+ if (uc_sync_send() < 0)
+ return (-2);
+
+ rv = -2;
+
+ if (uc_cfg.sock_type == SOCK_STREAM) {
+ fd2 = uc_socket_accept(fd1);
+ if (fd2 < 0)
+ goto done;
+ } else
+ fd2 = fd1;
+
+ if (uc_sync_recv() < 0)
+ goto done;
+
+ rv = 0;
+done:
+ if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+ if (uc_socket_close(fd2) < 0)
+ rv = -2;
+ return (rv);
+}
+
+int
+t_cmsg_len(void)
+{
+ return (t_generic(t_cmsg_len_client, t_cmsg_len_server));
+}
+#endif
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsg_len.h Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsg_len.h)
@@ -0,0 +1,32 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef __LP64__
+int t_cmsg_len(void);
+#endif
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.c Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.c)
@@ -0,0 +1,139 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_cmsgcred.h"
+
+int
+t_cmsgcred_client(int fd)
+{
+ struct msghdr msghdr;
+ struct iovec iov[1];
+ void *cmsg_data;
+ size_t cmsg_size;
+ int rv;
+
+ if (uc_sync_recv() < 0)
+ return (-2);
+
+ rv = -2;
+
+ cmsg_size = CMSG_SPACE(sizeof(struct cmsgcred));
+ cmsg_data = malloc(cmsg_size);
+ if (cmsg_data == NULL) {
+ uc_logmsg("malloc");
+ goto done;
+ }
+ uc_msghdr_init_client(&msghdr, iov, cmsg_data, cmsg_size,
+ SCM_CREDS, sizeof(struct cmsgcred));
+
+ if (uc_socket_connect(fd) < 0)
+ goto done;
+
+ if (uc_message_sendn(fd, &msghdr) < 0)
+ goto done;
+
+ rv = 0;
+done:
+ free(cmsg_data);
+ return (rv);
+}
+
+static int
+t_cmsgcred_server(int fd1)
+{
+ struct msghdr msghdr;
+ struct iovec iov[1];
+ struct cmsghdr *cmsghdr;
+ void *cmsg_data;
+ size_t cmsg_size;
+ u_int i;
+ int fd2, rv;
+
+ if (uc_sync_send() < 0)
+ return (-2);
+
+ fd2 = -1;
+ rv = -2;
+
+ cmsg_size = CMSG_SPACE(sizeof(struct cmsgcred));
+ cmsg_data = malloc(cmsg_size);
+ if (cmsg_data == NULL) {
+ uc_logmsg("malloc");
+ goto done;
+ }
+
+ if (uc_cfg.sock_type == SOCK_STREAM) {
+ fd2 = uc_socket_accept(fd1);
+ if (fd2 < 0)
+ goto done;
+ } else
+ fd2 = fd1;
+
+ rv = -1;
+ for (i = 1; i <= uc_cfg.ipc_msg.msg_num; ++i) {
+ uc_dbgmsg("message #%u", i);
+
+ uc_msghdr_init_server(&msghdr, iov, cmsg_data, cmsg_size);
+ if (uc_message_recv(fd2, &msghdr) < 0) {
+ rv = -2;
+ break;
+ }
+
+ if (uc_check_msghdr(&msghdr, sizeof(*cmsghdr)) < 0)
+ break;
+
+ cmsghdr = CMSG_FIRSTHDR(&msghdr);
+ if (uc_check_scm_creds_cmsgcred(cmsghdr) < 0)
+ break;
+ }
+ if (i > uc_cfg.ipc_msg.msg_num)
+ rv = 0;
+done:
+ free(cmsg_data);
+ if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+ if (uc_socket_close(fd2) < 0)
+ rv = -2;
+ return (rv);
+}
+
+int
+t_cmsgcred(void)
+{
+ return (t_generic(t_cmsgcred_client, t_cmsgcred_server));
+}
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred.h Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred.h)
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+int t_cmsgcred_client(int fd);
+int t_cmsgcred(void);
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.c)
@@ -0,0 +1,125 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_cmsgcred.h"
+#include "t_cmsgcred_sockcred.h"
+
+static int
+t_cmsgcred_sockcred_server(int fd1)
+{
+ struct msghdr msghdr;
+ struct iovec iov[1];
+ struct cmsghdr *cmsghdr;
+ void *cmsg_data, *cmsg1_data, *cmsg2_data;
+ size_t cmsg_size, cmsg1_size, cmsg2_size;
+ u_int i;
+ int fd2, rv, val;
+
+ fd2 = -1;
+ rv = -2;
+
+ cmsg1_size = CMSG_SPACE(SOCKCREDSIZE(uc_cfg.proc_cred.gid_num));
+ cmsg2_size = CMSG_SPACE(sizeof(struct cmsgcred));
+ cmsg1_data = malloc(cmsg1_size);
+ cmsg2_data = malloc(cmsg2_size);
+ if (cmsg1_data == NULL || cmsg2_data == NULL) {
+ uc_logmsg("malloc");
+ goto done;
+ }
+
+ uc_dbgmsg("setting LOCAL_CREDS");
+ val = 1;
+ if (setsockopt(fd1, 0, LOCAL_CREDS, &val, sizeof(val)) < 0) {
+ uc_logmsg("setsockopt(LOCAL_CREDS)");
+ goto done;
+ }
+
+ if (uc_sync_send() < 0)
+ goto done;
+
+ if (uc_cfg.sock_type == SOCK_STREAM) {
+ fd2 = uc_socket_accept(fd1);
+ if (fd2 < 0)
+ goto done;
+ } else
+ fd2 = fd1;
+
+ cmsg_data = cmsg1_data;
+ cmsg_size = cmsg1_size;
+ rv = -1;
+ for (i = 1; i <= uc_cfg.ipc_msg.msg_num; ++i) {
+ uc_dbgmsg("message #%u", i);
+
+ uc_msghdr_init_server(&msghdr, iov, cmsg_data, cmsg_size);
+ if (uc_message_recv(fd2, &msghdr) < 0) {
+ rv = -2;
+ break;
+ }
+
+ if (uc_check_msghdr(&msghdr, sizeof(*cmsghdr)) < 0)
+ break;
+
+ cmsghdr = CMSG_FIRSTHDR(&msghdr);
+ if (i == 1 || uc_cfg.sock_type == SOCK_DGRAM) {
+ if (uc_check_scm_creds_sockcred(cmsghdr) < 0)
+ break;
+ } else {
+ if (uc_check_scm_creds_cmsgcred(cmsghdr) < 0)
+ break;
+ }
+
+ cmsg_data = cmsg2_data;
+ cmsg_size = cmsg2_size;
+ }
+ if (i > uc_cfg.ipc_msg.msg_num)
+ rv = 0;
+done:
+ free(cmsg1_data);
+ free(cmsg2_data);
+ if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+ if (uc_socket_close(fd2) < 0)
+ rv = -2;
+ return (rv);
+}
+
+int
+t_cmsgcred_sockcred(void)
+{
+ return (t_generic(t_cmsgcred_client, t_cmsgcred_sockcred_server));
+}
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_cmsgcred_sockcred.h)
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+int t_cmsgcred_sockcred(void);
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_generic.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_generic.c Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_generic.c)
@@ -0,0 +1,73 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <stdarg.h>
+#include <stdbool.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+
+int
+t_generic(int (*client_func)(int), int (*server_func)(int))
+{
+ int fd, rv, rv_client;
+
+ switch (uc_client_fork()) {
+ case 0:
+ fd = uc_socket_create();
+ if (fd < 0)
+ rv = -2;
+ else {
+ rv = client_func(fd);
+ if (uc_socket_close(fd) < 0)
+ rv = -2;
+ }
+ uc_client_exit(rv);
+ break;
+ case 1:
+ fd = uc_socket_create();
+ if (fd < 0)
+ rv = -2;
+ else {
+ rv = server_func(fd);
+ rv_client = uc_client_wait();
+ if (rv == 0 || (rv == -2 && rv_client != 0))
+ rv = rv_client;
+ if (uc_socket_close(fd) < 0)
+ rv = -2;
+ }
+ break;
+ default:
+ rv = -2;
+ }
+ return (rv);
+}
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_generic.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_generic.h)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_generic.h Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_generic.h)
@@ -0,0 +1,30 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * Copyright (c) 2016 Maksym Sobolyev <sobomax at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+int t_generic(int (*client_func)(int), int (*server_func)(int));
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_peercred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_peercred.c Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.c)
@@ -0,0 +1,153 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ucred.h>
+#include <sys/un.h>
+#include <stdarg.h>
+#include <stdbool.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_peercred.h"
+
+static int
+check_xucred(const struct xucred *xucred, socklen_t len)
+{
+ int rc;
+
+ if (len != sizeof(*xucred)) {
+ uc_logmsgx("option value size %zu != %zu",
+ (size_t)len, sizeof(*xucred));
+ return (-1);
+ }
+
+ uc_dbgmsg("xucred.cr_version %u", xucred->cr_version);
+ uc_dbgmsg("xucred.cr_uid %lu", (u_long)xucred->cr_uid);
+ uc_dbgmsg("xucred.cr_ngroups %d", xucred->cr_ngroups);
+
+ rc = 0;
+
+ if (xucred->cr_version != XUCRED_VERSION) {
+ uc_logmsgx("xucred.cr_version %u != %d",
+ xucred->cr_version, XUCRED_VERSION);
+ rc = -1;
+ }
+ if (xucred->cr_uid != uc_cfg.proc_cred.euid) {
+ uc_logmsgx("xucred.cr_uid %lu != %lu (EUID)",
+ (u_long)xucred->cr_uid, (u_long)uc_cfg.proc_cred.euid);
+ rc = -1;
+ }
+ if (xucred->cr_ngroups == 0) {
+ uc_logmsgx("xucred.cr_ngroups == 0");
+ rc = -1;
+ }
+ if (xucred->cr_ngroups < 0) {
+ uc_logmsgx("xucred.cr_ngroups < 0");
+ rc = -1;
+ }
+ if (xucred->cr_ngroups > XU_NGROUPS) {
+ uc_logmsgx("xucred.cr_ngroups %hu > %u (max)",
+ xucred->cr_ngroups, XU_NGROUPS);
+ rc = -1;
+ }
+ if (xucred->cr_groups[0] != uc_cfg.proc_cred.egid) {
+ uc_logmsgx("xucred.cr_groups[0] %lu != %lu (EGID)",
+ (u_long)xucred->cr_groups[0], (u_long)uc_cfg.proc_cred.egid);
+ rc = -1;
+ }
+ if (uc_check_groups("xucred.cr_groups", xucred->cr_groups,
+ "xucred.cr_ngroups", xucred->cr_ngroups, false) < 0)
+ rc = -1;
+ return (rc);
+}
+
+static int
+t_peercred_client(int fd)
+{
+ struct xucred xucred;
+ socklen_t len;
+
+ if (uc_sync_recv() < 0)
+ return (-1);
+
+ if (uc_socket_connect(fd) < 0)
+ return (-1);
+
+ len = sizeof(xucred);
+ if (getsockopt(fd, 0, LOCAL_PEERCRED, &xucred, &len) < 0) {
+ uc_logmsg("getsockopt(LOCAL_PEERCRED)");
+ return (-1);
+ }
+
+ if (check_xucred(&xucred, len) < 0)
+ return (-1);
+
+ return (0);
+}
+
+static int
+t_peercred_server(int fd1)
+{
+ struct xucred xucred;
+ socklen_t len;
+ int fd2, rv;
+
+ if (uc_sync_send() < 0)
+ return (-2);
+
+ fd2 = uc_socket_accept(fd1);
+ if (fd2 < 0)
+ return (-2);
+
+ len = sizeof(xucred);
+ if (getsockopt(fd2, 0, LOCAL_PEERCRED, &xucred, &len) < 0) {
+ uc_logmsg("getsockopt(LOCAL_PEERCRED)");
+ rv = -2;
+ goto done;
+ }
+
+ if (check_xucred(&xucred, len) < 0) {
+ rv = -1;
+ goto done;
+ }
+
+ rv = 0;
+done:
+ if (uc_socket_close(fd2) < 0)
+ rv = -2;
+ return (rv);
+}
+
+int
+t_peercred(void)
+{
+ return (t_generic(t_peercred_client, t_peercred_server));
+}
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_peercred.h (from r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.h)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_peercred.h Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_peercred.h)
@@ -0,0 +1,29 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+int t_peercred(void);
Copied: stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.c (from r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/tools/regression/sockets/unix_cmsg/t_sockcred.c Mon Oct 1 17:26:41 2018 (r339066, copy of r309554, head/tools/regression/sockets/unix_cmsg/t_sockcred.c)
@@ -0,0 +1,215 @@
+/*-
+ * Copyright (c) 2005 Andrey Simonenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdlib.h>
+
+#include "uc_common.h"
+#include "t_generic.h"
+#include "t_sockcred.h"
+
+static int
+t_sockcred_client(int type, int fd)
+{
+ struct msghdr msghdr;
+ struct iovec iov[1];
+ int rv;
+
+ if (uc_sync_recv() < 0)
+ return (-2);
+
+ rv = -2;
+
+ uc_msghdr_init_client(&msghdr, iov, NULL, 0, 0, 0);
+
+ if (uc_socket_connect(fd) < 0)
+ goto done;
+
+ if (type == 2)
+ if (uc_sync_recv() < 0)
+ goto done;
+
+ if (uc_message_sendn(fd, &msghdr) < 0)
+ goto done;
+
+ rv = 0;
+done:
+ return (rv);
+}
+
+static int
+t_sockcred_server(int type, int fd1)
+{
+ struct msghdr msghdr;
+ struct iovec iov[1];
+ struct cmsghdr *cmsghdr;
+ void *cmsg_data;
+ size_t cmsg_size;
+ u_int i;
+ int fd2, rv, val;
+
+ fd2 = -1;
+ rv = -2;
+
+ cmsg_size = CMSG_SPACE(SOCKCREDSIZE(uc_cfg.proc_cred.gid_num));
+ cmsg_data = malloc(cmsg_size);
+ if (cmsg_data == NULL) {
+ uc_logmsg("malloc");
+ goto done;
+ }
+
+ if (type == 1) {
+ uc_dbgmsg("setting LOCAL_CREDS");
+ val = 1;
+ if (setsockopt(fd1, 0, LOCAL_CREDS, &val, sizeof(val)) < 0) {
+ uc_logmsg("setsockopt(LOCAL_CREDS)");
+ goto done;
+ }
+ }
+
+ if (uc_sync_send() < 0)
+ goto done;
+
+ if (uc_cfg.sock_type == SOCK_STREAM) {
+ fd2 = uc_socket_accept(fd1);
+ if (fd2 < 0)
+ goto done;
+ } else
+ fd2 = fd1;
+
+ if (type == 2) {
+ uc_dbgmsg("setting LOCAL_CREDS");
+ val = 1;
+ if (setsockopt(fd2, 0, LOCAL_CREDS, &val, sizeof(val)) < 0) {
+ uc_logmsg("setsockopt(LOCAL_CREDS)");
+ goto done;
+ }
+ if (uc_sync_send() < 0)
+ goto done;
+ }
+
+ rv = -1;
+ for (i = 1; i <= uc_cfg.ipc_msg.msg_num; ++i) {
+ uc_dbgmsg("message #%u", i);
+
+ uc_msghdr_init_server(&msghdr, iov, cmsg_data, cmsg_size);
+ if (uc_message_recv(fd2, &msghdr) < 0) {
+ rv = -2;
+ break;
+ }
+
+ if (i > 1 && uc_cfg.sock_type == SOCK_STREAM) {
+ if (uc_check_msghdr(&msghdr, 0) < 0)
+ break;
+ } else {
+ if (uc_check_msghdr(&msghdr, sizeof(*cmsghdr)) < 0)
+ break;
+
+ cmsghdr = CMSG_FIRSTHDR(&msghdr);
+ if (uc_check_scm_creds_sockcred(cmsghdr) < 0)
+ break;
+ }
+ }
+ if (i > uc_cfg.ipc_msg.msg_num)
+ rv = 0;
+done:
+ free(cmsg_data);
+ if (uc_cfg.sock_type == SOCK_STREAM && fd2 >= 0)
+ if (uc_socket_close(fd2) < 0)
+ rv = -2;
+ return (rv);
+}
+
+int
+t_sockcred_1(void)
+{
+ u_int i;
+ int fd, rv, rv_client;
+
+ switch (uc_client_fork()) {
+ case 0:
+ for (i = 1; i <= 2; ++i) {
+ uc_dbgmsg("client #%u", i);
+ fd = uc_socket_create();
+ if (fd < 0)
+ rv = -2;
+ else {
+ rv = t_sockcred_client(1, fd);
+ if (uc_socket_close(fd) < 0)
+ rv = -2;
+ }
+ if (rv != 0)
+ break;
+ }
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-stable-11
mailing list