summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2021-09-21 21:44:46 +0200
committerDaniel Friesel <derf@finalrewind.org>2021-09-25 09:20:54 +0200
commit4c16228c70a077510628319a0466c4902b34a834 (patch)
tree7e3e43ad2d3a2308e974b56b25251b358d8f458b /src
parent020a496aaf5d78fa2876fe409046fb4753fbfbd6 (diff)
Fix crash when X11 is connected via FD 0.
If stdin is not connected, the X11 connection may use FD 0, which is traditionally used for STDIN. Do not attempt reads from fd 0 unless it _really_ is connected to a terminal on stdin. Reported by https://github.com/pvanstam, thanks a lot! Closes #631 Closes #632
Diffstat (limited to 'src')
-rw-r--r--src/main.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/main.c b/src/main.c
index 93f02ad..4db4b36 100644
--- a/src/main.c
+++ b/src/main.c
@@ -158,8 +158,9 @@ int feh_main_iteration(int block)
FD_ZERO(&fdset);
FD_SET(xfd, &fdset);
- if (control_via_stdin)
+ if (control_via_stdin) {
FD_SET(STDIN_FILENO, &fdset);
+ }
#ifdef HAVE_INOTIFY
if (opt.auto_reload) {
FD_SET(opt.inotify_fd, &fdset);
@@ -210,7 +211,12 @@ int feh_main_iteration(int block)
in that */
feh_handle_timer();
}
- else if ((count > 0) && (FD_ISSET(STDIN_FILENO, &fdset)))
+ /*
+ * Beware: If stdin is not connected, we may end up with xfd == 0.
+ * However, STDIN_FILENO == 0 holds as well in most cases. So we must
+ * check control_via_stdin to avoid mistaking an X11 event for stdin.
+ */
+ else if ((count > 0) && control_via_stdin && (FD_ISSET(STDIN_FILENO, &fdset)))
feh_event_handle_stdin();
#ifdef HAVE_INOTIFY
else if ((count > 0) && (FD_ISSET(opt.inotify_fd, &fdset)))
@@ -227,7 +233,7 @@ int feh_main_iteration(int block)
&& ((errno == ENOMEM) || (errno == EINVAL)
|| (errno == EBADF)))
eprintf("Connection to X display lost");
- else if ((count > 0) && (FD_ISSET(STDIN_FILENO, &fdset)))
+ else if ((count > 0) && control_via_stdin && (FD_ISSET(STDIN_FILENO, &fdset)))
feh_event_handle_stdin();
#ifdef HAVE_INOTIFY
else if ((count > 0) && (FD_ISSET(opt.inotify_fd, &fdset)))