Deleted Added
full compact
sblock.c (256281) sblock.c (281974)
1/*-
2 * Copyright (c) 2007 Robert N. M. Watson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 2007 Robert N. M. Watson
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: stable/10/tools/regression/sockets/sblock/sblock.c 243313 2012-11-19 22:53:57Z emaste $
26 * $FreeBSD: stable/10/tools/regression/sockets/sblock/sblock.c 281974 2015-04-25 05:31:52Z ngie $
27 */
28
29/*
30 * Sockets serialize I/O in each direction in order to avoid interlacing of
31 * I/O by multiple processes or threcvs recving or sending the socket. This
32 * is done using some form of kernel lock (varies by kernel version), called
33 * "sblock" in FreeBSD. However, to avoid unkillable processes waiting on
34 * I/O that may be entirely controlled by a remote network endpoint, that

--- 14 unchanged lines hidden (view full) ---

49#include <errno.h>
50#include <signal.h>
51#include <stdio.h>
52#include <stdlib.h>
53#include <unistd.h>
54
55static int interrupted;
56static void
27 */
28
29/*
30 * Sockets serialize I/O in each direction in order to avoid interlacing of
31 * I/O by multiple processes or threcvs recving or sending the socket. This
32 * is done using some form of kernel lock (varies by kernel version), called
33 * "sblock" in FreeBSD. However, to avoid unkillable processes waiting on
34 * I/O that may be entirely controlled by a remote network endpoint, that

--- 14 unchanged lines hidden (view full) ---

49#include <errno.h>
50#include <signal.h>
51#include <stdio.h>
52#include <stdlib.h>
53#include <unistd.h>
54
55static int interrupted;
56static void
57signal_handler(int signum)
57signal_handler(int signum __unused)
58{
59
60 interrupted++;
61}
62
63/*
64 * Process that will perform a blocking recv on a UNIX domain socket. This
65 * should return one byte of data.

--- 24 unchanged lines hidden (view full) ---

90 * succeeded, we get EINTR as the signal interrupts the lock request.
91 */
92static void
93locking_recver(int fd)
94{
95 ssize_t len;
96 char ch;
97
58{
59
60 interrupted++;
61}
62
63/*
64 * Process that will perform a blocking recv on a UNIX domain socket. This
65 * should return one byte of data.

--- 24 unchanged lines hidden (view full) ---

90 * succeeded, we get EINTR as the signal interrupts the lock request.
91 */
92static void
93locking_recver(int fd)
94{
95 ssize_t len;
96 char ch;
97
98 if (sleep(1) < 0)
98 if (sleep(1) != 0)
99 err(-1, "FAIL: locking_recver: sleep");
100 len = recv(fd, &ch, sizeof(ch), 0);
101 if (len < 0 && errno != EINTR)
102 err(-1, "FAIL: locking_recver: recv");
103 if (len < 0 && errno == EINTR) {
104 fprintf(stderr, "PASS\n");
105 exit(0);
106 }

--- 4 unchanged lines hidden (view full) ---

111}
112
113static void
114signaller(pid_t locking_recver_pid, int fd)
115{
116 ssize_t len;
117 char ch;
118
99 err(-1, "FAIL: locking_recver: sleep");
100 len = recv(fd, &ch, sizeof(ch), 0);
101 if (len < 0 && errno != EINTR)
102 err(-1, "FAIL: locking_recver: recv");
103 if (len < 0 && errno == EINTR) {
104 fprintf(stderr, "PASS\n");
105 exit(0);
106 }

--- 4 unchanged lines hidden (view full) ---

111}
112
113static void
114signaller(pid_t locking_recver_pid, int fd)
115{
116 ssize_t len;
117 char ch;
118
119 if (sleep(2) < 0) {
119 if (sleep(2) != 0) {
120 warn("signaller sleep(2)");
121 return;
122 }
123 if (kill(locking_recver_pid, SIGHUP) < 0) {
124 warn("signaller kill(%d)", locking_recver_pid);
125 return;
126 }
120 warn("signaller sleep(2)");
121 return;
122 }
123 if (kill(locking_recver_pid, SIGHUP) < 0) {
124 warn("signaller kill(%d)", locking_recver_pid);
125 return;
126 }
127 if (sleep(1) < 0) {
127 if (sleep(1) != 0) {
128 warn("signaller sleep(1)");
129 return;
130 }
131 len = send(fd, &ch, sizeof(ch), 0);
132 if (len < 0) {
133 warn("signaller send");
134 return;
135 }
136 if (len != sizeof(ch)) {
137 warnx("signaller send ret %zd", len);
138 return;
139 }
140 if (close(fd) < 0) {
141 warn("signaller close");
142 return;
143 }
128 warn("signaller sleep(1)");
129 return;
130 }
131 len = send(fd, &ch, sizeof(ch), 0);
132 if (len < 0) {
133 warn("signaller send");
134 return;
135 }
136 if (len != sizeof(ch)) {
137 warnx("signaller send ret %zd", len);
138 return;
139 }
140 if (close(fd) < 0) {
141 warn("signaller close");
142 return;
143 }
144 if (sleep(1) < 0) {
144 if (sleep(1) != 0) {
145 warn("signaller sleep(1)");
146 return;
147 }
148}
149
150int
145 warn("signaller sleep(1)");
146 return;
147 }
148}
149
150int
151main(int argc, char *argv[])
151main(void)
152{
153 int error, fds[2], recver_fd, sender_fd;
154 pid_t blocking_recver_pid;
155 pid_t locking_recver_pid;
156 struct sigaction sa;
157
158 if (sigaction(SIGHUP, NULL, &sa) < 0)
159 err(-1, "FAIL: sigaction(SIGHUP, NULL, &sa)");

--- 48 unchanged lines hidden ---
152{
153 int error, fds[2], recver_fd, sender_fd;
154 pid_t blocking_recver_pid;
155 pid_t locking_recver_pid;
156 struct sigaction sa;
157
158 if (sigaction(SIGHUP, NULL, &sa) < 0)
159 err(-1, "FAIL: sigaction(SIGHUP, NULL, &sa)");

--- 48 unchanged lines hidden ---