Skip to content

Commit d02689e

Browse files
q2venPaolo Abeni
authored andcommitted
selftest: af_unix: Check SIGURG after every send() in msg_oob.c
When data is sent with MSG_OOB, SIGURG is sent to a process if the receiver socket has set its owner to the process by ioctl(FIOSETOWN) or fcntl(F_SETOWN). This patch adds SIGURG check after every send(MSG_OOB) call. Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 436352e commit d02689e

1 file changed

Lines changed: 50 additions & 1 deletion

File tree

tools/testing/selftests/net/af_unix/msg_oob.c

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include <unistd.h>
77

88
#include <netinet/in.h>
9+
#include <sys/ioctl.h>
10+
#include <sys/signalfd.h>
911
#include <sys/socket.h>
1012

1113
#include "../../kselftest_harness.h"
@@ -19,6 +21,7 @@ FIXTURE(msg_oob)
1921
* 2: TCP sender
2022
* 3: TCP receiver
2123
*/
24+
int signal_fd;
2225
bool tcp_compliant;
2326
};
2427

@@ -77,6 +80,35 @@ static void create_tcp_socketpair(struct __test_metadata *_metadata,
7780
ASSERT_EQ(ret, 0);
7881
}
7982

83+
static void setup_sigurg(struct __test_metadata *_metadata,
84+
FIXTURE_DATA(msg_oob) *self)
85+
{
86+
struct signalfd_siginfo siginfo;
87+
int pid = getpid();
88+
sigset_t mask;
89+
int i, ret;
90+
91+
for (i = 0; i < 2; i++) {
92+
ret = ioctl(self->fd[i * 2 + 1], FIOSETOWN, &pid);
93+
ASSERT_EQ(ret, 0);
94+
}
95+
96+
ret = sigemptyset(&mask);
97+
ASSERT_EQ(ret, 0);
98+
99+
ret = sigaddset(&mask, SIGURG);
100+
ASSERT_EQ(ret, 0);
101+
102+
ret = sigprocmask(SIG_BLOCK, &mask, NULL);
103+
ASSERT_EQ(ret, 0);
104+
105+
self->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK);
106+
ASSERT_GE(self->signal_fd, 0);
107+
108+
ret = read(self->signal_fd, &siginfo, sizeof(siginfo));
109+
ASSERT_EQ(ret, -1);
110+
}
111+
80112
static void close_sockets(FIXTURE_DATA(msg_oob) *self)
81113
{
82114
int i;
@@ -90,6 +122,8 @@ FIXTURE_SETUP(msg_oob)
90122
create_unix_socketpair(_metadata, self);
91123
create_tcp_socketpair(_metadata, self);
92124

125+
setup_sigurg(_metadata, self);
126+
93127
self->tcp_compliant = true;
94128
}
95129

@@ -104,9 +138,24 @@ static void __sendpair(struct __test_metadata *_metadata,
104138
{
105139
int i, ret[2];
106140

107-
for (i = 0; i < 2; i++)
141+
for (i = 0; i < 2; i++) {
142+
struct signalfd_siginfo siginfo = {};
143+
int bytes;
144+
108145
ret[i] = send(self->fd[i * 2], buf, len, flags);
109146

147+
bytes = read(self->signal_fd, &siginfo, sizeof(siginfo));
148+
149+
if (flags & MSG_OOB) {
150+
ASSERT_EQ(bytes, sizeof(siginfo));
151+
ASSERT_EQ(siginfo.ssi_signo, SIGURG);
152+
153+
bytes = read(self->signal_fd, &siginfo, sizeof(siginfo));
154+
}
155+
156+
ASSERT_EQ(bytes, -1);
157+
}
158+
110159
ASSERT_EQ(ret[0], len);
111160
ASSERT_EQ(ret[0], ret[1]);
112161
}

0 commit comments

Comments
 (0)