You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix crash on redefining array in subshell (re: 1731f66)
The referenced commit left one test unexecuted because it crashes.
Minimal reproducer:
typeset -a arr=((a b c) 1)
got=$( typeset -a arr=( ( ((a b c)1))) )
The crash occurs when the array is redefined in a subshell.
Here are abridged ASan stack traces for the crash, for the use
after free, and for when it was freed:
=================================================================
==73147==ERROR: AddressSanitizer: heap-use-after-free [snippage]
READ of size 8 at 0x000107403eb0 thread T0
#0 0x104fded40 in nv_search nvdisc.c:1007
#1 0x104fbeb1c in nv_create name.c:860
#2 0x104fb8b9c in nv_open name.c:1440
#3 0x104fb1edc in nv_setlist name.c:309
#4 0x104fb4a30 in nv_setlist name.c:475
#5 0x105055b58 in sh_exec xec.c:1079
#6 0x105045cd4 in sh_subshell subshell.c:654
#7 0x104f92c1c in comsubst macro.c:2266
[snippage]
0x000107403eb0 is located 0 bytes inside of 80-byte region [snippage]
freed by thread T0 here:
#0 0x105c5ade4 in wrap_free+0x98 (libclang_rt.asan_osx_dynamic.dylib:arm64e+0x3ede4)
#1 0x105261da0 in dtclose dtclose.c:52
#2 0x104f178cc in array_putval array.c:671
#3 0x104fd7f4c in nv_putv nvdisc.c:144
#4 0x104fbc5f0 in _nv_unset name.c:2435
#5 0x104fb3250 in nv_setlist name.c:364
#6 0x105055b58 in sh_exec xec.c:1079
#7 0x105045cd4 in sh_subshell subshell.c:654
#8 0x104f92c1c in comsubst macro.c:2266
[snippage]
So the crash is caused because array_putval (array.c:671) calls
dtclose, freeing ap->table, which is then reused after a recursive
nv_setlist call via nv_open() -> nv_create() -> nv_search().
This only happens whwn we're in a virtual subshell.
src/cmd/ksh93/sh/array.c:
- array_putval(): When redefining an array in a virtual subshell,
do not free the old ap->table; it will be needed by the parent
shell environment.
0 commit comments