diff options
author | Daniel Friesel <derf@finalrewind.org> | 2021-09-21 21:44:46 +0200 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2021-09-25 09:20:54 +0200 |
commit | 4c16228c70a077510628319a0466c4902b34a834 (patch) | |
tree | 7e3e43ad2d3a2308e974b56b25251b358d8f458b | |
parent | 020a496aaf5d78fa2876fe409046fb4753fbfbd6 (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
-rw-r--r-- | src/main.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -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))) |