read builtin: Empty variables on timeout

This matches how a non-timeout error is handled.

Reviewed by:	jilles
MFC after:	2 weeks
Differential Revision: https://reviews.freebsd.org/D31876
This commit is contained in:
Bryan Drewery 2020-05-23 10:01:45 -07:00
parent 0389e9be63
commit e31fb97148
4 changed files with 29 additions and 0 deletions

View File

@ -231,6 +231,8 @@ readcmd(int argc __unused, char **argv __unused)
* If there's nothing ready, return an error.
*/
if (status <= 0) {
while (*ap != NULL)
setvar(*ap++, "", 0);
sig = pendingsig;
return (128 + (sig != 0 ? sig : SIGALRM));
}

View File

@ -141,6 +141,8 @@ ${PACKAGE}FILES+= read6.0
${PACKAGE}FILES+= read7.0
${PACKAGE}FILES+= read8.0
${PACKAGE}FILES+= read9.0
${PACKAGE}FILES+= read10.0
${PACKAGE}FILES+= read11.0
${PACKAGE}FILES+= return1.0
${PACKAGE}FILES+= return2.1
${PACKAGE}FILES+= return3.1

View File

@ -0,0 +1,8 @@
set -e
v=original_value
r=0
read v < /dev/null || r=$?
[ "$r" -eq 1 ]
[ -z "$v" ]

View File

@ -0,0 +1,17 @@
set -e
T=$(mktemp -d ${TMPDIR:-/tmp}/sh-test.XXXXXX)
trap 'rm -rf "$T"' 0
cd $T
mkfifo fifo1
# Open fifo1 for writing and then read block on a dummy fifo
{ mkfifo fifo2; read dummy <fifo2; } >fifo1 &
# Wait for the child to open fifo1 for writing
exec 3<fifo1
v=original_value
r=0
read -t 0 v <&3 || r=$?
kill -TERM "$!" || :
{ [ "$r" -gt 128 ] && [ "$(kill -l "$r")" = ALRM ]; } || exit
[ -z "$v" ]