HomeFreeBSD

sh: Don't assume EINTR means SIGALRM

Description

sh: Don't assume EINTR means SIGALRM

While waiting for input in the read builtin, if select() is interrupted
but there is no pending signal, we act like we timed out, and return the
same status as if we had been interrupted by SIGALRM, instead of looping
until we actually do time out.

  • Replace the single select() call with a ppoll() loop.
  • Improve validation of the timeout value. We now accept things like "1h30m15s", which we used to silently truncate to "1h". The flip side is that we no longer accept things like "1hour" or "5sec".
  • Modify the existing read -t 0 test case to verify that read returns immediately when there is input and fails immediately when there isn't.
  • Add a second test case which performs the same tests with a non-zero timeout value.

PR: 290844
MFC after: 1 week
Fixes: c4539460e3a4 ("sh: Improve error handling in read builtin:")
Reviewed by: jilles, bdrewery
Differential Revision: https://reviews.freebsd.org/D53761

(cherry picked from commit 3c2643a7dbac370b7232f4e5ac15fd77b9ff396d)

Details

Provenance
desAuthored on Nov 19 2025, 10:43 AM
Reviewer
jilles
Differential Revision
D53761: sh: Don't assume EINTR means SIGALRM
Parents
rGe9019e777ca3: sh tests: Fix racy test11.0
Branches
Unknown
Tags
Unknown