tail: fix EINTR handling on older systems

tail(1) could fail with an "Interrupted system call"
diagnostic, on some systems like Centos 5 (Linux 2.6.18).
This was seen with tests/tail/overlay-headers.sh
which sends SIGCONT, which should not induce a failure.

* src/tail.c (tail_forever_inotify): Retry the poll()
upon receiving a non terminating signal, and the syscall
is not automatically restarted by the system.
* NEWS: Mention the bug fix.
Reported by Bruno Haible.
This commit is contained in:
Pádraig Brady 2026-01-24 18:04:46 +00:00
parent ec77664a31
commit ebb856730c
2 changed files with 5 additions and 1 deletions

4
NEWS
View File

@ -31,6 +31,10 @@ GNU coreutils NEWS -*- outline -*-
'numfmt' no longer drops custom suffixes from numbers it cannot fully parse. 'numfmt' no longer drops custom suffixes from numbers it cannot fully parse.
[bug introduced with numfmt in coreutils-8.21] [bug introduced with numfmt in coreutils-8.21]
'tail -f --pid' can no longer exit upon receiving a non terminating signal.
On older Linux systems it may have failed with "Interrupted system call".
[bug introduced in coreutils-7.5]
'timeout' will now propagate all terminating signals to the monitored command. 'timeout' will now propagate all terminating signals to the monitored command.
Previously 'timeout' could have exited and left the monitored command running. Previously 'timeout' could have exited and left the monitored command running.
[bug introduced with timeout in coreutils-7.0] [bug introduced with timeout in coreutils-7.0]

View File

@ -1684,7 +1684,7 @@ tail_forever_inotify (int wd, struct File_spec *f, int n_files,
pfd[1].events = pfd[1].revents = 0; pfd[1].events = pfd[1].revents = 0;
file_change = poll (pfd, monitor_output + 1, delay); file_change = poll (pfd, monitor_output + 1, delay);
} }
while (file_change == 0); while (file_change == 0 || (file_change < 0 && errno == EINTR));
if (file_change < 0) if (file_change < 0)
error (EXIT_FAILURE, errno, error (EXIT_FAILURE, errno,