Re: Bash leaks memory when doing function calls while reading from subshell as stdin

2017-12-17 Thread Øyvind Hvidsten

Awesome. Thanks!

On 08/12/17 15:57, Chet Ramey wrote:

On 12/7/17 7:41 AM, Øyvind Hvidsten wrote:


Bash Version: 4.4
Patch Level: 12
Release Status: release

Description:
 Somehow the included script causes a memory leak. Memory usage will
grow huge over a very short timeframe.


Thanks for the report. It's the return in f2 that causes the problem.
This will be fixed in the next devel branch push. If you want to play
around with the fix, I've attached a patch.

Chet





Re: foo=$*: ^A and DEL are prefixed or removed

2017-12-17 Thread Martijn Dekker
Op 16-12-17 om 17:06 schreef Chet Ramey:
> On 11/24/17 3:17 AM, Martijn Dekker wrote:
>> Here's another corner-case bug with assigning $* to a variable (i.e.:
>> foo=$*). If IFS is empty, the $* expansion removes any $'\001' (^A) and
>> $'\177' (DEL) characters. If IFS contains a value, each ^A and DEL
>> character is prefixed by another $'\001'. If IFS is unset, the bug does
>> not show up at all.
> 
> Thanks for the report. I'll fix this for the next version.

FWIW, here's a test script. It's POSIX compatible so you can compare
with other shells. Correct output is
soh stx etx del   / soh stx etx del
for all cases.

- M.

defaultIFS=$IFS
set -o errexit -o noglob
(set -o pipefail) 2>/dev/null && set -o pipefail
teststring=$(printf '\1\2\3\177')
n=0

trim_od() {
od -a | sed -n '1 { s/^0*[[:blank:]]*//; s/[[:blank:]]*$//; p; }'
}

doTest() {
set -- "$teststring"
eval "$testcmd"
case ${IFS+s}${IFS:+n} in
( sn )  i=$(printf %s "$IFS" | trim_od) ;;
( s )   i='(null)' ;;
( '' )  i='(unset)' ;;
( * )   echo 'internal error!' >&2; exit 125 ;;
esac
printf '\n%03d: IFS = %s: %s\n' "$((n+=1))" "$i" "$testcmd"
printf %s "$*${foo+/}${foo-}" | trim_od
}

doAllTests() {
for testcmd in \
'unset -v foo; set -- ${foo=$*}' \
'unset -v foo; set -- ${foo="$*"}' \
'unset -v foo; set -- "${foo=$*}"' \
\
'foo=; set -- ${foo:=$*}' \
'foo=; set -- ${foo:="$*"}' \
'foo=; set -- "${foo:=$*}"' \
\
'unset -v foo; set -- ${foo=$@}' \
'unset -v foo; set -- ${foo="$@"}' \
'unset -v foo; set -- "${foo=$@}"' \
\
'foo=; set -- ${foo:=$@}' \
'foo=; set -- ${foo:="$@"}' \
'foo=; set -- "${foo:=$@}"'
do
doTest "$testcmd"
done
}

unset -v IFS; doAllTests
IFS=''; doAllTests
IFS='x'; doAllTests
IFS=$defaultIFS; doAllTests



this makes sense

2017-12-17 Thread isabella parakiss
IFS=_ foo_bar=well; set foo bar; echo "i'm a ${!@} designed language"