continue;
return -errno;
-
- } else if (r == 0)
+ }
+ if (r == 0)
return count;
+ if (pollfd.revents & POLLNVAL)
+ return -EBADF;
+
l = read(fd, buf, sizeof(buf));
if (l < 0) {
if (r == 0)
return 0;
+ if (pollfd.revents & POLLNVAL)
+ return -EBADF;
+
return pollfd.revents & POLLHUP;
}
if (r == 0)
return 0;
+ if (pollfd.revents & POLLNVAL)
+ return -EBADF;
+
return pollfd.revents;
}
if (r == 0)
return 0;
+ if (pollfd.revents & POLLNVAL)
+ return -EBADF;
+
if (iteration >= MAX_FLUSH_ITERATIONS)
return log_debug_errno(SYNTHETIC_ERRNO(EBUSY),
"Failed to flush connections within " STRINGIFY(MAX_FLUSH_ITERATIONS) " iterations.");
return log_error_errno(errno, "Couldn't wait for journal event: %m");
}
- if (pollfds[1].revents & (POLLHUP|POLLERR)) /* STDOUT has been closed? */
+ if (pollfds[1].revents & (POLLHUP|POLLERR|POLLNVAL)) /* STDOUT has been closed? */
return log_debug_errno(SYNTHETIC_ERRNO(ECANCELED),
"Standard output has been closed.");
+ if (pollfds[0].revents & POLLNVAL)
+ return log_debug_errno(SYNTHETIC_ERRNO(EBADF), "Change fd closed?");
+
r = sd_journal_process(j);
if (r < 0)
return log_error_errno(r, "Failed to process journal events: %m");
r = poll(&p, 1, 0);
if (r < 0)
return -errno;
+ if (p.revents & POLLNVAL)
+ return -EBADF;
if (!(p.revents & (POLLOUT|POLLERR|POLLHUP)))
return 0;
r = ppoll(p, n, m == USEC_INFINITY ? NULL : timespec_store(&ts, m), NULL);
if (r < 0)
return -errno;
+ if (r == 0)
+ return 0;
+
+ if (p[0].revents & POLLNVAL)
+ return -EBADF;
+ if (n >= 2 && (p[1].revents & POLLNVAL))
+ return -EBADF;
- return r > 0 ? 1 : 0;
+ return 1;
}
_public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) {
return -errno;
if (r == 0)
return -ETIMEDOUT;
+ if (pfd.revents & POLLNVAL)
+ return -EBADF;
return 1;
}
}
static int rtnl_poll(sd_netlink *rtnl, bool need_more, uint64_t timeout_usec) {
- struct pollfd p[1] = {};
struct timespec ts;
usec_t m = USEC_INFINITY;
int r, e;
if (timeout_usec != (uint64_t) -1 && (m == (uint64_t) -1 || timeout_usec < m))
m = timeout_usec;
- p[0].fd = rtnl->fd;
- p[0].events = e;
+ struct pollfd p = {
+ .fd = rtnl->fd,
+ .events = e,
+ };
- r = ppoll(p, 1, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
+ r = ppoll(&p, 1, m == (uint64_t) -1 ? NULL : timespec_store(&ts, m), NULL);
if (r < 0)
return -errno;
+ if (r == 0)
+ return 0;
- return r > 0 ? 1 : 0;
+ if (p.revents & POLLNVAL)
+ return -EBADF;
+
+ return 1;
}
int sd_netlink_wait(sd_netlink *nl, uint64_t timeout_usec) {
continue;
return -errno;
- } else if (r == 0)
+ }
+ if (r == 0)
return -EAGAIN;
+ if (pfd.revents & POLLNVAL)
+ return -EBADF;
/* receive next message */
break;
goto finish;
}
+ if (pollfd[POLL_SOCKET].revents & POLLNVAL ||
+ (notify >= 0 && pollfd[POLL_INOTIFY].revents & POLLNVAL)) {
+ r = -EBADF;
+ goto finish;
+ }
+
if (notify >= 0 && pollfd[POLL_INOTIFY].revents != 0)
(void) flush_fd(notify);
goto finish;
}
+ if ((pollfd[POLL_TTY].revents & POLLNVAL) ||
+ (notify >= 0 && (pollfd[POLL_INOTIFY].revents & POLLNVAL))) {
+ r = -EBADF;
+ goto finish;
+ }
+
if (notify >= 0 && pollfd[POLL_INOTIFY].revents != 0 && keyname) {
(void) flush_fd(notify);
goto finish;
}
+ if (pollfd[FD_SOCKET].revents & POLLNVAL ||
+ pollfd[FD_SIGNAL].revents & POLLNVAL ||
+ (notify >= 0 && pollfd[FD_INOTIFY].revents & POLLNVAL)) {
+ r = -EBADF;
+ goto finish;
+ }
+
if (pollfd[FD_SIGNAL].revents & POLLIN) {
r = -EINTR;
goto finish;
uint64_t buf;
int r;
- r = poll(pfd, 2, -1);
- if (r < 0 && IN_SET(errno, EAGAIN, EINTR))
- continue;
- else if (r < 0)
+ r = poll(pfd, ELEMENTSOF(pfd), -1);
+ if (r < 0) {
+ if (IN_SET(errno, EAGAIN, EINTR))
+ continue;
+ goto error;
+ }
+ if (pfd[0].revents & POLLNVAL ||
+ pfd[1].revents & POLLNVAL)
goto error;
if (pfd[1].revents) {
k = poll(&pollfd, 1, (end - t) / USEC_PER_MSEC);
if (k < 0)
return -errno;
-
if (k == 0)
return -ETIME;
+ if (pollfd.revents & POLLNVAL)
+ return -EBADF;
n = write(fd, p, left);
if (n < 0) {
NULL);
if (r < 0)
return -errno;
+ if (r == 0)
+ return 0;
- handle_revents(v, pfd.revents);
+ if (pfd.revents & POLLNVAL)
+ return -EBADF;
- return r > 0 ? 1 : 0;
+ handle_revents(v, pfd.revents);
+ return 1;
}
int varlink_get_fd(Varlink *v) {
.events = POLLOUT,
};
- if (poll(&pfd, 1, -1) < 0)
+ r = poll(&pfd, 1, -1);
+ if (r < 0)
return -errno;
+ assert(r > 0);
+ if (pfd.revents & POLLNVAL)
+ return -EBADF;
+
handle_revents(v, pfd.revents);
}
tfd = safe_close(tfd);
+ if (FLAGS_SET(fds.revents, POLLNVAL))
+ return log_error_errno(SYNTHETIC_ERRNO(EBADF), "Invalid timer fd to sleep on?");
+
if (!FLAGS_SET(fds.revents, POLLIN)) /* We woke up before the alarm time, we are done. */
return 0;
ts = timespec_store(&_ts, t);
}
- {
- struct pollfd p[3] = {
- {.fd = fd, .events = events_a },
- {.fd = STDIN_FILENO, .events = events_b & POLLIN },
- {.fd = STDOUT_FILENO, .events = events_b & POLLOUT },
- };
-
- r = ppoll(p, ELEMENTSOF(p), ts, NULL);
- }
+ struct pollfd p[3] = {
+ { .fd = fd, .events = events_a },
+ { .fd = STDIN_FILENO, .events = events_b & POLLIN },
+ { .fd = STDOUT_FILENO, .events = events_b & POLLOUT },
+ };
+
+ r = ppoll(p, ELEMENTSOF(p), ts, NULL);
if (r < 0)
return log_error_errno(errno, "ppoll() failed: %m");
+ if (p[0].revents & POLLNVAL ||
+ p[1].revents & POLLNVAL ||
+ p[2].revents & POLLNVAL)
+ return log_error_errno(SYNTHETIC_ERRNO(EBADF), "Invalid file descriptor to poll on?");
}
return 0;
return -errno;
}
+ if (pollfd[FD_SIGNAL].revents & POLLNVAL ||
+ pollfd[FD_INOTIFY].revents & POLLNVAL)
+ return -EBADF;
+
if (pollfd[FD_INOTIFY].revents != 0)
(void) flush_fd(notify);
return -ETIMEDOUT;
/* wake up when queue becomes empty */
- if (poll(&pfd, 1, MSEC_PER_SEC) > 0 && pfd.revents & POLLIN) {
+ r = poll(&pfd, 1, MSEC_PER_SEC);
+ if (r < 0)
+ return -errno;
+ if (pfd.revents & POLLNVAL)
+ return -EBADF;
+ if (r > 0 && pfd.revents & POLLIN) {
r = udev_queue_flush(queue);
if (r < 0)
return log_error_errno(r, "Failed to flush queue: %m");
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;