Commit 4c16228c authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

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
parent 020a496a
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -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)))