mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
The previous fix for the += operator introduced a use-after-free bug that could result in a variable pointing to random garbage: $ foo=bar $ foo+=_foo true $ typeset -p foo foo=V V The use after free issue occurs because when nv_clone creates a copy of $foo in the true command's invocation-local scope, it does not duplicate the string $foo points to. As a result, the $foo variable in the parent scope points to the same string as $foo in the invocation-local scope, which causes the use after free bug when cloned $foo variable is freed from memory. src/cmd/ksh93/sh/nvdisc.c: - To fix the use after free bug, allow nv_clone to duplicate the string with memdup or strdup when no flags are passed. src/cmd/ksh93/tests/variables.sh: - Add a regression test for using the += operator with regular commands. src/cmd/ksh93/tests/leaks.sh: - Add a regression test to ensure the bugfix doesn't introduce any memory leaks.
This commit is contained in:
parent
bc6c5dbdd9
commit
e87dbebebd
5 changed files with 36 additions and 4 deletions
|
|
@ -1356,5 +1356,14 @@ got=$("$SHELL" -c 'echo $SHLVL; "$SHELL" -c "echo \$SHLVL"; exec "$SHELL" -c "ec
|
|||
[[ $got == "$exp" ]] || err_exit "SHLVL not increased correctly" \
|
||||
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
|
||||
|
||||
# ======
|
||||
# The += operator should not free variables outside of its
|
||||
# scope when used in an invocation-local assignment.
|
||||
exp='baz_foo
|
||||
baz'
|
||||
got=$("$SHELL" -c $'foo=baz; foo+=_foo "$SHELL" -c \'print $foo\'; print $foo')
|
||||
[[ $exp == "$got" ]] || err_exit "using the += operator for invocation-local assignments changes variables outside of the invocation-local scope" \
|
||||
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
|
||||
|
||||
# ======
|
||||
exit $((Errors<125?Errors:125))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue