Commit c9b75c7bd7036a6895bbc3eba2ed0369238ebab4

Stefan Sperling 2022-05-19T07:31:57

revert "Skip poll(2) if an imsgbuf has a non-empty read buffer" imsg_read() will call recvmsg() on the file descriptor regardless of the read buffer's state, so we should ensure that data is ready. The read buffer is used by imsg_get(), not imsg_read(). We already call imsg_get() before imsg_read(), and call the latter only if imsg_get() returns zero.

diff --git a/lib/privsep.c b/lib/privsep.c
index 135b8b6..782f94a 100644
--- a/lib/privsep.c
+++ b/lib/privsep.c
@@ -94,15 +94,9 @@ read_imsg(struct imsgbuf *ibuf)
 	const struct got_error *err;
 	size_t n;
 
-	/*
-	 * There is no imsg API function to tell us whether the
-	 * read buffer still contains pending data :-(
-	 */
-	if (ibuf->r.wpos < IMSG_HEADER_SIZE) {
-		err = poll_fd(ibuf->fd, POLLIN, INFTIM);
-		if (err)
-			return err;
-	}
+	err = poll_fd(ibuf->fd, POLLIN, INFTIM);
+	if (err)
+		return err;
 
 	n = imsg_read(ibuf);
 	if (n == -1) {