Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177361900
D57426.1794200033.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
3 KB
Referenced Files
None
Subscribers
None
D57426.1794200033.diff
View Options
diff --git a/tests/sys/kern/unix_passfd_test.c b/tests/sys/kern/unix_passfd_test.c
--- a/tests/sys/kern/unix_passfd_test.c
+++ b/tests/sys/kern/unix_passfd_test.c
@@ -208,6 +208,19 @@
return (val != 0);
}
+static bool
+passrights(int sockfd)
+{
+ socklen_t sz;
+ int rc, val;
+
+ sz = sizeof(val);
+ rc = getsockopt(sockfd, SOL_SOCKET, SO_PASSRIGHTS, &val, &sz);
+ ATF_REQUIRE_MSG(rc != -1, "getsockopt(SO_PASSRIGHTS) failed: %s",
+ strerror(errno));
+ return (val != 0);
+}
+
static ssize_t
recvfd_payload(int sockfd, int *recv_fd, void *buf, size_t buflen,
size_t cmsgsz, int recvmsg_flags, bool failok)
@@ -576,6 +589,83 @@
closesocketpair(fd);
}
+ATF_TC_WITHOUT_HEAD(send_rejected);
+ATF_TC_BODY(send_rejected, tc)
+{
+ ssize_t len;
+ int fd[2], optval, putfd, rc;
+ char ch;
+
+ domainsocketpair(fd);
+ ATF_REQUIRE_MSG(passrights(fd[0]),
+ "socketpair socket not initialized with so_passrights");
+ ATF_REQUIRE_MSG(passrights(fd[1]),
+ "socketpair socket not initialized with SO_PASSRIGHTS");
+
+ tempfile(&putfd);
+
+ /* Toggle SO_PASSRIGHTS off on the receiver side. */
+ optval = 0;
+ rc = setsockopt(fd[1], SOL_SOCKET, SO_PASSRIGHTS, &optval,
+ sizeof(optval));
+ ATF_REQUIRE_MSG(rc != -1, "setsockopt(SO_PASSRIGHTS) failed: %s",
+ strerror(errno));
+ /* Confirm that the sender-side didn't reflect that... */
+ ATF_REQUIRE_MSG(passrights(fd[0]),
+ "setsockopt(SO_PASSRIGHTS) switched the sender");
+ /* ... and that the receiver-side did. */
+ ATF_REQUIRE_MSG(!passrights(fd[1]),
+ "setsockopt(SO_PASSRIGHTS) did not switch the receiver");
+
+ ch = 0;
+ len = sendfd_payload(fd[0], putfd, &ch, sizeof(ch));
+ ATF_REQUIRE_MSG(len == -1,
+ "sending SCM_RIGHTS with SO_PASSRIGHTS disabled on peer did not fail");
+ ATF_REQUIRE_MSG(errno == EPERM,
+ "bad SCM_RIGHTS failure: %s", strerror(errno));
+ closesocketpair(fd);
+}
+
+ATF_TC_WITHOUT_HEAD(send_rejected_late);
+ATF_TC_BODY(send_rejected_late, tc)
+{
+ ssize_t len;
+ int fd[2], nfds, optval, putfd, rc, recv_fd;
+ char ch;
+#define MAGIC_VAL 42
+
+ domainsocketpair(fd);
+ tempfile(&putfd);
+
+ nfds = getnfds();
+
+ ch = MAGIC_VAL;
+ len = sendfd_payload(fd[0], putfd, &ch, sizeof(ch));
+ ATF_REQUIRE_MSG(len == sizeof(ch),
+ "valid send of SCM_RIGHTS failed: %s", strerror(errno));
+
+ /*
+ * Toggle SO_PASSRIGHTS off on the receiver side. The subsequent recv
+ * should actually succeed, we just won't have an fd installed.
+ */
+ optval = 0;
+ rc = setsockopt(fd[1], SOL_SOCKET, SO_PASSRIGHTS, &optval,
+ sizeof(optval));
+ ATF_REQUIRE_MSG(rc != -1, "setsockopt(SO_PASSRIGHTS) failed: %s",
+ strerror(errno));
+
+ ch = 0;
+ len = recvfd_payload(fd[1], &recv_fd, &ch, sizeof(ch),
+ CMSG_SPACE(sizeof(int)), 0, true);
+ /* We want to confirm that we still received the sent byte... */
+ ATF_REQUIRE_MSG(len == sizeof(ch), "recvmsg should have returned data");
+ ATF_REQUIRE_MSG(ch == MAGIC_VAL, "recvmsg returned garbage? %d", ch);
+
+ /* ... and make sure we did not receive any descriptors! */
+ ATF_REQUIRE(getnfds() == nfds);
+ closesocketpair(fd);
+}
+
/*
* Make sure that we do not receive descriptors with MSG_PEEK.
*/
@@ -1233,6 +1323,8 @@
ATF_TP_ADD_TC(tp, send_and_shutdown);
ATF_TP_ADD_TC(tp, send_a_lot);
ATF_TP_ADD_TC(tp, send_overflow);
+ ATF_TP_ADD_TC(tp, send_rejected);
+ ATF_TP_ADD_TC(tp, send_rejected_late);
ATF_TP_ADD_TC(tp, peek);
ATF_TP_ADD_TC(tp, two_files);
ATF_TP_ADD_TC(tp, bundle);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Nov 9, 4:53 AM (9 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41605846
Default Alt Text
D57426.1794200033.diff (3 KB)
Attached To
Mode
D57426: tests: unix: add SCM_RIGHTS tests for SO_PASSRIGHTS
Attached
Detach File
Event Timeline