Page MenuHomeFreeBSD

D32722.id97788.diff
No OneTemporary

D32722.id97788.diff

Index: lib/libnv/tests/nvlist_send_recv_test.c
===================================================================
--- lib/libnv/tests/nvlist_send_recv_test.c
+++ lib/libnv/tests/nvlist_send_recv_test.c
@@ -337,13 +337,13 @@
nvlist_destroy(nvl);
}
-ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_nvlist);
-ATF_TC_BODY(nvlist_send_recv__send_nvlist, tc)
+static void
+nvlist_send_recv__send_nvlist(short sotype)
{
int socks[2], status;
pid_t pid;
- ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, socks) == 0);
+ ATF_REQUIRE(socketpair(PF_UNIX, sotype, 0, socks) == 0);
pid = fork();
ATF_REQUIRE(pid >= 0);
@@ -361,13 +361,13 @@
ATF_REQUIRE(status == 0);
}
-ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_closed_fd);
-ATF_TC_BODY(nvlist_send_recv__send_closed_fd, tc)
+static void
+nvlist_send_recv__send_closed_fd(short sotype)
{
nvlist_t *nvl;
int socks[2];
- ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, socks) == 0);
+ ATF_REQUIRE(socketpair(PF_UNIX, sotype, 0, socks) == 0);
nvl = nvlist_create(0);
ATF_REQUIRE(nvl != NULL);
@@ -377,6 +377,7 @@
ATF_REQUIRE_ERRNO(EBADF, nvlist_send(socks[1], nvl) != 0);
}
+
static int
nopenfds(void)
{
@@ -428,15 +429,15 @@
}
}
-ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_many_fds);
-ATF_TC_BODY(nvlist_send_recv__send_many_fds, tc)
+static void
+nvlist_send_recv__send_many_fds(short sotype)
{
char name[16];
nvlist_t *nvl;
int anfds, bnfds, fd, i, j, socks[2], status;
pid_t pid;
- ATF_REQUIRE(socketpair(PF_UNIX, SOCK_STREAM, 0, socks) == 0);
+ ATF_REQUIRE(socketpair(PF_UNIX, sotype, 0, socks) == 0);
pid = fork();
ATF_REQUIRE(pid >= 0);
@@ -471,12 +472,60 @@
ATF_REQUIRE(status == 0);
}
+/*
+ * Note: It may be necessary to tune the following sysctl's:
+ * net.local.dgram.maxdgram=16772
+ * net.local.dgram.recvspace=150000-(ish)
+ *
+ * I had to bump recvspace to ~150000 and maxdgram to 16772 for a passing test.
+ * It seems the receive queue for the socket fills up quicker than it's being
+ * emptied. Only applies to test case nvlist_send_recv__send_many_fds__dgram.
+ */
+ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_many_fds__dgram);
+ATF_TC_BODY(nvlist_send_recv__send_many_fds__dgram, tc)
+{
+ nvlist_send_recv__send_many_fds(SOCK_DGRAM);
+}
+
+ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_many_fds__stream);
+ATF_TC_BODY(nvlist_send_recv__send_many_fds__stream, tc)
+{
+ nvlist_send_recv__send_many_fds(SOCK_STREAM);
+}
+
+ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_nvlist__dgram);
+ATF_TC_BODY(nvlist_send_recv__send_nvlist__dgram, tc)
+{
+ nvlist_send_recv__send_nvlist(SOCK_DGRAM);
+}
+
+ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_nvlist__stream);
+ATF_TC_BODY(nvlist_send_recv__send_nvlist__stream, tc)
+{
+ nvlist_send_recv__send_nvlist(SOCK_STREAM);
+}
+
+ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_closed_fd__dgram);
+ATF_TC_BODY(nvlist_send_recv__send_closed_fd__dgram, tc)
+{
+ nvlist_send_recv__send_closed_fd(SOCK_DGRAM);
+}
+
+ATF_TC_WITHOUT_HEAD(nvlist_send_recv__send_closed_fd__stream);
+ATF_TC_BODY(nvlist_send_recv__send_closed_fd__stream, tc)
+{
+ nvlist_send_recv__send_closed_fd(SOCK_STREAM);
+}
+
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, nvlist_send_recv__send_nvlist);
- ATF_TP_ADD_TC(tp, nvlist_send_recv__send_closed_fd);
- ATF_TP_ADD_TC(tp, nvlist_send_recv__send_many_fds);
+ ATF_TP_ADD_TC(tp, nvlist_send_recv__send_nvlist__dgram);
+ ATF_TP_ADD_TC(tp, nvlist_send_recv__send_nvlist__stream);
+ ATF_TP_ADD_TC(tp, nvlist_send_recv__send_closed_fd__dgram);
+ ATF_TP_ADD_TC(tp, nvlist_send_recv__send_closed_fd__stream);
+ ATF_TP_ADD_TC(tp, nvlist_send_recv__send_many_fds__dgram);
+ ATF_TP_ADD_TC(tp, nvlist_send_recv__send_many_fds__stream);
return (atf_no_error());
}
Index: sys/contrib/libnv/nvlist.c
===================================================================
--- sys/contrib/libnv/nvlist.c
+++ sys/contrib/libnv/nvlist.c
@@ -1277,10 +1277,16 @@
struct nvlist_header nvlhdr;
nvlist_t *nvl, *ret;
unsigned char *buf;
- size_t nfds, size, i;
- int *fds;
+ size_t nfds, size, i, offset;
+ int *fds, soflags, sotype;
+ socklen_t solen;
+
+ solen = sizeof(sotype);
+ if (getsockopt(sock, SOL_SOCKET, SO_TYPE, &sotype, &solen) != 0)
+ return (NULL);
- if (buf_recv(sock, &nvlhdr, sizeof(nvlhdr), 0) == -1)
+ soflags = sotype == SOCK_DGRAM ? MSG_PEEK : 0;
+ if (buf_recv(sock, &nvlhdr, sizeof(nvlhdr), soflags) == -1)
return (NULL);
if (!nvlist_check_header(&nvlhdr))
@@ -1293,12 +1299,17 @@
if (buf == NULL)
return (NULL);
- memcpy(buf, &nvlhdr, sizeof(nvlhdr));
-
ret = NULL;
fds = NULL;
- if (buf_recv(sock, buf + sizeof(nvlhdr), size - sizeof(nvlhdr), 0) == -1)
+ if (sotype == SOCK_DGRAM)
+ offset = 0;
+ else {
+ memcpy(buf, &nvlhdr, sizeof(nvlhdr));
+ offset = sizeof(nvlhdr);
+ }
+
+ if (buf_recv(sock, buf + offset, size - offset, 0) == -1)
goto out;
if (nfds > 0) {

File Metadata

Mime Type
text/plain
Expires
Tue, Mar 17, 5:28 PM (15 h, 17 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29837110
Default Alt Text
D32722.id97788.diff (4 KB)

Event Timeline