Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F148238113
D32722.id97788.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D32722.id97788.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D32722: libnv: read entire datagram in nvlist_recv()
Attached
Detach File
Event Timeline
Log In to Comment