Skip to content

Commit

Permalink
tests/unix_seqpacket: test send(2) to a closed or aborted peer socket
Browse files Browse the repository at this point in the history
In both cases the kernel returns EPIPE and delivers SIGPIPE, unless
blocked or disabled.  The test isn't specific to SOCK_SEQPACKET, it is the
same for SOCK_STREAM.  Put the test into this file, since it has all
primitives to write this test tersely.

Reviewed by:		tuexen
Differential Revision:	https://reviews.freebsd.org/D44146
  • Loading branch information
glebius committed Apr 8, 2024
1 parent eb338e2 commit f992782
Showing 1 changed file with 48 additions and 0 deletions.
48 changes: 48 additions & 0 deletions tests/sys/kern/unix_seqpacket_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -530,6 +530,53 @@ ATF_TC_BODY(send_before_accept, tc)
close(a);
}

/*
* Test that close(2) of the peer ends in EPIPE when we try to send(2).
* Test both normal case as well as a peer that was not accept(2)-ed.
*/
static bool sigpipe_received = false;
static void
sigpipe_handler(int signo __unused)
{
sigpipe_received = true;
}

ATF_TC_WITHOUT_HEAD(send_to_closed);
ATF_TC_BODY(send_to_closed, tc)
{
struct sigaction sa = {
.sa_handler = sigpipe_handler,
};
const struct sockaddr_un *sun;
int l, s, a;

ATF_REQUIRE(sigemptyset(&sa.sa_mask) == 0);
ATF_REQUIRE(sigaction(SIGPIPE, &sa, NULL) == 0);

sun = mk_listening_socket(&l);

ATF_REQUIRE((s = socket(PF_LOCAL, SOCK_SEQPACKET, 0)) > 0);
ATF_REQUIRE(connect(s, (struct sockaddr *)sun, sizeof(*sun)) == 0);
ATF_REQUIRE((a = accept(l, NULL, NULL)) != 1);
close(a);
ATF_REQUIRE(send(s, &s, sizeof(s), 0) == -1);
ATF_REQUIRE(errno == EPIPE);
ATF_REQUIRE(sigpipe_received == true);
close(s);

ATF_REQUIRE((s = socket(PF_LOCAL, SOCK_SEQPACKET, 0)) > 0);
ATF_REQUIRE(connect(s, (struct sockaddr *)sun, sizeof(*sun)) == 0);
close(l);
sigpipe_received = false;
ATF_REQUIRE(send(s, &s, sizeof(s), 0) == -1);
ATF_REQUIRE(errno == EPIPE);
ATF_REQUIRE(sigpipe_received == true);
close(s);

sa.sa_handler = SIG_DFL;
ATF_REQUIRE(sigaction(SIGPIPE, &sa, NULL) == 0);
}

/* Implied connect is unix/dgram only feature. Fails on stream or seqpacket. */
ATF_TC_WITHOUT_HEAD(implied_connect);
ATF_TC_BODY(implied_connect, tc)
Expand Down Expand Up @@ -1264,6 +1311,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, send_recv_with_connect);
ATF_TP_ADD_TC(tp, sendto_recvfrom);
ATF_TP_ADD_TC(tp, send_before_accept);
ATF_TP_ADD_TC(tp, send_to_closed);
ATF_TP_ADD_TC(tp, implied_connect);
ATF_TP_ADD_TC(tp, shutdown_send);
ATF_TP_ADD_TC(tp, shutdown_send_sigpipe);
Expand Down

0 comments on commit f992782

Please sign in to comment.