mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix truncating of files with <>;file combined with <#pattern
The issue with truncating files was caused by out-of-sync streams. Details and discussion: https://github.com/att/ast/issues/61 src/cmd/ksh93/sh/io.c: sh_iorestore(): - To be safe, sync all streams before restoring file descriptors. src/cmd/ksh93/tests/io.sh: - Add two regression tests for truncating files with this combination of redirections. - The second test, which invokes a -c script, is disabled for now as this triggers another corner case bug involving the SH_NOFORK optimisaton for -c scripts. That fix is for another commit. (cherry picked from commit 18fb64840365c2ff4608188e5487bd79d08f67d1)
This commit is contained in:
parent
a638e724d0
commit
e999f6b169
4 changed files with 32 additions and 1 deletions
|
@ -502,4 +502,24 @@ done {n}< /dev/null
|
|||
n=$( exec {n}< /dev/null; print -r -- $n)
|
||||
[[ -r /dev/fd/$n ]] && err_exit "file descriptor n=$n left open after subshell"
|
||||
|
||||
# ======
|
||||
# Truncating a file using <> and >#num
|
||||
# https://github.com/att/ast/issues/61
|
||||
|
||||
for ((i=1; i<=10; i++)) do print "$i"; done | tee "$tmp/nums2" > "$tmp/nums1"
|
||||
expect=$'1\n2\n3\n4'
|
||||
|
||||
(1<>;"$tmp/nums1" >#5)
|
||||
actual=$(cat "$tmp/nums1")
|
||||
[[ "$actual" = "$expect" ]] || err_exit "Failed to truncate file in subshell \
|
||||
(expected $(printf %q "$expect"), got $(printf %q "$actual"))"
|
||||
|
||||
: <<\INACTIVE # TODO: the >#5 is optimised away by a '-c' optimisation corner case bug
|
||||
"$SHELL" -c '1<>;"$1/nums2" >#5' x "$tmp"
|
||||
actual=$(cat "$tmp/nums2")
|
||||
[[ "$actual" = "$expect" ]] || err_exit "Failed to truncate file in -c script \
|
||||
(expected $(printf %q "$expect"), got $(printf %q "$actual"))"
|
||||
INACTIVE
|
||||
|
||||
# ======
|
||||
exit $((Errors<125?Errors:125))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue