From 68e14d3d5f4116ad3aca0e392d008645ea90cf70 Mon Sep 17 00:00:00 2001 From: Goldwyn Rodrigues Date: Fri, 8 Dec 2023 09:04:39 -0600 Subject: [PATCH] more: exit if POLLERR and POLLHUP on stdin is received References: bsc#1220117 more command continues to run in case stdin have closed the file and it takes 100% of CPU. This is because revents on stdin send POLLIN | POLLHUP | POLLERR once stdin is closed. more receives it even though it is not requested in events. This is common Linux behaviour to never mask out POLLHUP or POLLERR. The loop in more_key_command() runs infinitely because more_poll() returns 0 and read_command() reads 0 bytes. Check for POLLERR and POLLHUP, and exit more in case of an error. Steps to reproduce: 1. Setup /etc/systemd/logind.conf with KillUserProcesses=no 2. Add config "Defaults use_pty" in /etc/sudoers 3. Start an ssh session to the machine 4. # sudo su - 5. # more 6. kill the parent ssh process, say close the tab At this time "more" runs with 100% CPU utilization. Signed-off-by: Goldwyn Rodrigues diff --git a/text-utils/more.c b/text-utils/more.c index d4db3d5eb..a49acbc3e 100644 --- a/text-utils/more.c +++ b/text-utils/more.c @@ -1392,6 +1392,11 @@ static int more_poll(struct more_control *ctl, int timeout) abort(); } } + + /* Check for POLLERR and POLLHUP in stdin revents */ + if ((pfd[1].revents & POLLERR) && (pfd[1].revents & POLLHUP)) + more_exit(ctl); + if (pfd[1].revents == 0) return 1; return 0;