diff options
author | Lennart Poettering <lennart@poettering.net> | 2020-06-09 13:40:25 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2020-06-10 08:57:31 +0200 |
commit | dad28bffd67692d6c22e0de98ddb0d217c034ec5 (patch) | |
tree | 29b5ec4a723341c4a38636d8be4566dba5a38ec0 /src/userdb/userwork.c | |
parent | Merge pull request #16104 from ssahani/dhcpv6-iaid (diff) | |
download | systemd-dad28bffd67692d6c22e0de98ddb0d217c034ec5.tar.xz systemd-dad28bffd67692d6c22e0de98ddb0d217c034ec5.zip |
tree-wide: check POLLNVAL everywhere
poll() sets POLLNVAL inside of the poll structures if an invalid fd is
passed. So far we generally didn't check for that, thus not taking
notice of the error. Given that this specific kind of error is generally
indication of a programming error, and given that our code is embedded
into our projects via NSS or because people link against our library,
let's explicitly check for this and convert it to EBADF.
(I ran into a busy loop because of this missing check when some of my
test code accidentally closed an fd it shouldn't close, so this is a
real thing)
Diffstat (limited to 'src/userdb/userwork.c')
-rw-r--r-- | src/userdb/userwork.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/userdb/userwork.c b/src/userdb/userwork.c index ac04af0ca8..4a8c98384d 100644 --- a/src/userdb/userwork.c +++ b/src/userdb/userwork.c @@ -757,6 +757,8 @@ static int run(int argc, char *argv[]) { if (poll(&pfd, 1, 0) < 0) return log_error_errno(errno, "Failed to test for POLLIN on listening socket: %m"); + if (FLAGS_SET(pfd.revents, POLLNVAL)) + return log_error_errno(SYNTHETIC_ERRNO(EBADF), "Listening socket dead?"); if (FLAGS_SET(pfd.revents, POLLIN)) { pid_t parent; |