diff options
author | Alexander Bluhm <bluhm@cvs.openbsd.org> | 2024-06-28 21:07:28 +0000 |
---|---|---|
committer | Alexander Bluhm <bluhm@cvs.openbsd.org> | 2024-06-28 21:07:28 +0000 |
commit | 77a28373846daf72eb9f39ffede9d135305cf090 (patch) | |
tree | 1b67719e6bfb3e6cd065f51f7aed7c0de1417d47 | |
parent | 7cf36b3946c66e906b8729a16f457ac39826dcc5 (diff) |
Test writing to socket pair closed by the other side. This must
trigger EPIPE error.
with and OK mvs@
-rw-r--r-- | regress/sys/kern/unp-write-closed/Makefile | 5 | ||||
-rw-r--r-- | regress/sys/kern/unp-write-closed/unp-write-closed.c | 83 |
2 files changed, 88 insertions, 0 deletions
diff --git a/regress/sys/kern/unp-write-closed/Makefile b/regress/sys/kern/unp-write-closed/Makefile new file mode 100644 index 00000000000..83299417480 --- /dev/null +++ b/regress/sys/kern/unp-write-closed/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1.1.1 2024/06/28 21:07:27 bluhm Exp $ + +PROG= unp-write-closed + +.include <bsd.regress.mk> diff --git a/regress/sys/kern/unp-write-closed/unp-write-closed.c b/regress/sys/kern/unp-write-closed/unp-write-closed.c new file mode 100644 index 00000000000..51e84ec7c65 --- /dev/null +++ b/regress/sys/kern/unp-write-closed/unp-write-closed.c @@ -0,0 +1,83 @@ +/* $OpenBSD: unp-write-closed.c,v 1.1.1.1 2024/06/28 21:07:27 bluhm Exp $ */ +/* + * Copyright (c) 2024 Vitaliy Makkoveev <mvs@openbsd.org> + * Copyright (c) 2024 Alenander Bluhm <bluhm@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/wait.h> + +#include <err.h> +#include <errno.h> +#include <signal.h> +#include <unistd.h> + +sig_atomic_t done = 0; + +void +handler(int sigraised) +{ + done = 1; +} + +int +main(int argc, char *argv[]) +{ + int i, s[2], status; + pid_t pid; + + if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) + err(1, "signal pipe"); + if (signal(SIGALRM, handler) == SIG_ERR) + err(1, "signal alrm"); + alarm(30); + + while (!done) { + if (socketpair(AF_UNIX, SOCK_STREAM, 0, s) < 0) + err(1, "socketpair"); + + switch ((pid = fork())) { + case -1: + err(1, "fork"); + case 0: + if (close(s[0]) < 0) + err(1, "child close 0"); + if (close(s[1]) < 0) + err(1, "child close 1"); + return 0; + default: + if (close(s[1]) < 0) + err(1, "parent close 1"); + for (i = 1000000; i > 0; i--) { + if (write(s[0], "1", 1) < 0) + break; + } + if (i <= 0) + errx(1, "write did not fail"); + if (errno != EPIPE) + err(1, "write"); + if (close(s[0]) < 0) + err(1, "parent close 1"); + if (waitpid(pid, &status, 0) < 0) + err(1, "waitpid"); + if (status != 0) + errx(1, "child status %d", status); + break; + } + } + + return 0; +} |