Re: [BUG] heap-buffer-overflow(read) pmatch() src/expand.c:1630:18

Aleksander Ushakov <[email protected]> Mon, 19 Jan 2026 20:26:08 +0300
Newsgroups org.kernel.vger.dash
Message-ID <CADdNFauHj_tYhNzD1pr7j1OSVYK8u0T1aKyrc9PibhKd-9JCaA@mail.gmail.com>
It's fixed here: 4595bd6549344c90ce7e8e90f1034cec724884db

пт, 16 янв. 2026 г. в 22:16, Aleksander Ushakov <[email protected]>:
>
> Dear Dash maintainers,
>
> I encountered a bug in Dash in commit f8aaaa and would like to report
> it. The details are provided below.
>
> =================================================================
> ==4318==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x5030000003e3 at pc 0x652f51dd63bf bp 0x7ffd65724250 sp 0x7ffd65724248
> READ of size 1 at 0x5030000003e3 thread T0
>     #0 0x652f51dd63be in pmatch /upstream/dash/src/expand.c:1630:18
>     #1 0x652f51dd74d8 in expmeta /upstream/dash/src/expand.c:1391:7
>     #2 0x652f51dd1cc1 in expandmeta /upstream/dash/src/expand.c:1271:3
>     #3 0x652f51dd0c2c in expandarg /upstream/dash/src/expand.c:206:3
>     #4 0x652f51dc866b in evalcommand /upstream/dash/src/eval.c:806:4
>     #5 0x652f51dc7855 in evaltree /upstream/dash/src/eval.c:299:12
>     #6 0x652f51dc7855 in evaltree /upstream/dash/src/eval.c:299:12
>     #7 0x652f51de1dd2 in cmdloop /upstream/dash/src/main.c:242:8
>     #8 0x652f51de19de in main /upstream/dash/src/main.c:176:3
>     #9 0x74bc543e8249 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
>     #10 0x74bc543e8304 in __libc_start_main csu/../csu/libc-start.c:360:3
>     #11 0x652f51ce3530 in _start (/upstream/dash/src/dash+0x38530) (BuildId: 7f6a58087379909d6c654473930c3998f14e8e99)
>
> 0x5030000003e3 is located 0 bytes after 19-byte region [0x5030000003d0,0x5030000003e3)
> allocated by thread T0 here:
>     #0 0x652f51d827cf in malloc (/upstream/dash/src/dash+0xd77cf) (BuildId: 7f6a58087379909d6c654473930c3998f14e8e99)
>     #1 0x652f51de24d4 in ckmalloc /upstream/dash/src/memalloc.c:55:6
>     #2 0x652f51dd2a8a in _rmescapes /upstream/dash/src/expand.c:1687:8
>     #3 0x652f51dd55e3 in preglob /upstream/dash/src/expand.c:151:9
>     #4 0x652f51dd1c81 in expandmeta /upstream/dash/src/expand.c:1266:7
>     #5 0x652f51dd0c2c in expandarg /upstream/dash/src/expand.c:206:3
>     #6 0x652f51dc866b in evalcommand /upstream/dash/src/eval.c:806:4
>     #7 0x652f51dc7855 in evaltree /upstream/dash/src/eval.c:299:12
>     #8 0x652f51dc7855 in evaltree /upstream/dash/src/eval.c:299:12
>     #9 0x652f51de1dd2 in cmdloop /upstream/dash/src/main.c:242:8
>     #10 0x652f51de19de in main /upstream/dash/src/main.c:176:3
>     #11 0x74bc543e8249 in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16
>
> SUMMARY: AddressSanitizer: heap-buffer-overflow /upstream/dash/src/expand.c:1630:18 in pmatch
> Shadow bytes around the buggy address:
>   0x503000000100: 00 00 00 00 fa fa 00 00 00 00 fa fa 00 00 00 00
>   0x503000000180: fa fa 00 00 00 00 fa fa 00 00 00 00 fa fa 00 00
>   0x503000000200: 00 00 fa fa 00 00 00 00 fa fa 00 00 00 00 fa fa
>   0x503000000280: 00 00 00 00 fa fa 00 00 00 00 fa fa 00 00 00 00
>   0x503000000300: fa fa 00 00 00 00 fa fa 00 00 00 00 fa fa 00 00
> =>0x503000000380: 00 00 fa fa 00 00 03 fa fa fa 00 00[03]fa fa fa
>   0x503000000400: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x503000000480: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x503000000500: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x503000000580: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
>   0x503000000600: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
> Shadow byte legend (one shadow byte represents 8 application bytes):
>   Addressable:           00
>   Partially addressable: 01 02 03 04 05 06 07
>   Heap left redzone:       fa
>   Freed heap region:       fd
>   Stack left redzone:      f1
>   Stack mid redzone:       f2
>   Stack right redzone:     f3
>   Stack after return:      f5
>   Stack use after scope:   f8
>   Global redzone:          f9
>   Global init order:       f6
>   Poisoned by user:        f7
>   Container overflow:      fc
>   Array cookie:            ac
>   Intra object redzone:    bb
>   ASan internal:           fe
>   Left alloca redzone:     ca
>   Right alloca redzone:    cb
> ==4318==ABORTING
>
> ////////////////
> Place in code
> ////////////////
>                                         if (chr == c)
>                                                 found = 1;
>                                 }
>                  ---->} while ((c = *p++) != ']');
>                         if (found == invert)
>                                 return 0;
>                         q++;
>
>
> ////////////////
> My environment:
> ////////////////
>
> Debian-12, x86-64, clang-19 compiler
>
> /////////////////
> Steps to reproduce:
> /////////////////
>
> $ aclocal && autoheader && automake --add-missing && autoconf
> $ CC=clang CFLAGS=" -Wno-everything -fsanitize=address -g -O0" ./configure --disable-fnmatch --disable-lineno --disable-glob
> $ make
> $ cd src
> $ ./dash < myfile.txt
>
> //////////////////
> Steps to get myfile.txt:
> //////////////////
>
> copy the text into file bs64.txt (between ==== and ======):
> =====================================================================================
> PkA3OyRCLWdlIFuFaZs/PwJlc3Nzc3Nzc3Mt
> =====================================================================================
> Or just take from attachments:
>