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.
[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.
Previously 'timeout' could have exited and left the monitored command running.
[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;
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)
error (EXIT_FAILURE, errno,