From 081b6b34aa80d0f028d155d4b04c2673846b9a8b Mon Sep 17 00:00:00 2001 From: mpi Date: Fri, 29 Oct 2021 13:13:04 +0000 Subject: [PATCH] Test that poll(2) returns POLLNVAL for an already closed fd. poll(2) rewrite on top of kqueue is currently blocking instead of returning. Regression reported by Larry Hynes with a reproducer from Leah Neukirchen, thanks a lot! --- regress/sys/kern/poll/Makefile | 5 +++++ regress/sys/kern/poll/pollnval.c | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 regress/sys/kern/poll/Makefile create mode 100644 regress/sys/kern/poll/pollnval.c diff --git a/regress/sys/kern/poll/Makefile b/regress/sys/kern/poll/Makefile new file mode 100644 index 00000000000..5b9265b9586 --- /dev/null +++ b/regress/sys/kern/poll/Makefile @@ -0,0 +1,5 @@ +# $OpenBSD: Makefile,v 1.1 2021/10/29 13:13:04 mpi Exp $ + +PROG= pollnval + +.include diff --git a/regress/sys/kern/poll/pollnval.c b/regress/sys/kern/poll/pollnval.c new file mode 100644 index 00000000000..adc9132e473 --- /dev/null +++ b/regress/sys/kern/poll/pollnval.c @@ -0,0 +1,37 @@ +/* $OpenBSD: pollnval.c,v 1.1 2021/10/29 13:13:04 mpi Exp $ */ + +/* + * Copyright (c) 2021 Leah Neukirchen + * + * 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 +#include +#include +#include + +int +main(void) +{ + struct pollfd fds[1]; + + fds[0].fd = 0; + fds[0].events = POLLIN | POLLHUP; + close(0); + + assert(poll(fds, 1, -1) == 1); + assert(fds[0].revents & POLLNVAL); + + return 0; +} -- 2.20.1