[v4 PATCH] input: Fix EINTR handling when reading from a pipe
Herbert Xu <[email protected]> Tue, 14 Apr 2026 07:45:08 +0800
| Newsgroups | org.kernel.vger.dash |
|---|---|
| Message-ID | <[email protected]> |
Restore the fallback tee definition so that it actually compiles. ---8<--- Errors from tee(2) should not lead to the fallback path in every case. In fact, only EINVAL should trigger an attempt to call read(2). Every other error (and zero == EOF) returned by tee(2) should be treated as if it came from read(2). Reported-by: Ignacy Gawędzki <[email protected]> Signed-off-by: Herbert Xu <[email protected]> diff --git a/configure.ac b/configure.ac index c37eefe..d749440 100644 --- a/configure.ac +++ b/configure.ac @@ -135,6 +135,10 @@ if test "$use_fnmatch" = yes && test "$enable_glob" = yes; then fi if test "$enable_tee" != no; then + AC_CHECK_FUNCS(tee, use_tee=yes) +fi + +if test "$use_tee" = yes; then AC_DEFINE([USE_TEE], [1], [Non-zero if tee(2) should be used]) else AC_DEFINE([USE_TEE], [0], [Non-zero if tee(2) should be used]) diff --git a/src/input.c b/src/input.c index 71282fb..4e30010 100644 --- a/src/input.c +++ b/src/input.c @@ -183,7 +183,12 @@ static int stdin_tee(void *buf, int nr) flush_tee(buf, nr, stdin_state.pending); - err = USE_TEE ? tee(0, stdin_state.pip[1], nr, 0) : -1; + if (USE_TEE) + err = tee(0, stdin_state.pip[1], nr, 0); + else { + errno = EINVAL; + err = -1; + } stdin_state.pending = err; return err; } @@ -324,13 +329,13 @@ retry: if (!fd && !stdin_bufferable()) { nr = stdin_tee(buf, nr); fd = stdin_state.pip[0]; - if (nr <= 0) { + if (nr < 0 && errno == EINVAL) { fd = 0; nr = 1; } } - if (nr >= 0) + if (nr > 0) nr = read(fd, buf, nr); if (nr < 0) { -- Email: Herbert Xu <[email protected]> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt