Hi,

thanks for the report. The issue has always been there and had to do
with the width of minicom's window (over 256 columns). I have addressed
this.

Martin, I have pushed this on the 2.8.x branch (8deebed). Please
pick both changes there for the next upload.


Thanks, Adam

On Fri Jun 11, 2021 at 15:29:55 +0100, Mike Crowe wrote:
> Package: minicom
> Version: 2.8-1
> Severity: important
> 
> Steps to reproduce:
> 
> 1. Start Minicom connected to a serial port with MINICOM="-m -c on -8"
> (although I was also able to reproduce the problem with MINICOM="" if the
> keystrokes below are changed appropriately.)
> 
> 2. Cause whatever is connected to emit more than a screenful of text.
>    (Without this, Minicom won't let you enter history mode.)
> 
> 3. Press Alt-B to enter history mode. Press / to search, type something
>    short that doesn't exist in the history and press Enter.
> 
> Expected result:
> 
> Minicom searches for the specified text in the buffer as it always did
> successfully in the Buster version of Minicom.
> 
> Actual result:
> 
>  *** stack smashing detected ***: terminated
> 
> and Minicom exits.
> 
> I tried compiling Minicom from the Debian package source with CC="gcc
> -fsanitize=address" and got:
> 
> =================================================================
> ==3332560==ERROR: AddressSanitizer: stack-buffer-overflow on address 
> 0x7ffc81d544e0 at pc 0x556347a102d8 bp 0x7ffc81d54080 sp 0x7ffc81d54078
> WRITE of size 4 at 0x7ffc81d544e0 thread T0
>     #0 0x556347a102d7 in mc_wdrawelm_var ../../src/window.c:1055
>     #1 0x5563479efb65 in find_next ../../src/minicom.c:336
>     #2 0x5563479ec687 in scrollback ../../src/minicom.c:533
>     #3 0x5563479ec687 in main ../../src/minicom.c:1646
>     #4 0x7f0b62d83d09 in __libc_start_main ../csu/libc-start.c:308
>     #5 0x5563479ee6c9 in _start 
> (/overflow/mac/Debian/minicom-2.8/build/src/minicom+0x236c9)
> 
> Address 0x7ffc81d544e0 is located in stack of thread T0 at offset 1056 in 
> frame
>     #0 0x5563479efa0f in find_next ../../src/minicom.c:309
> 
>   This frame has 1 object(s):
>     [32, 1056) 'tmp_line' (line 312) <== Memory access at offset 1056 
> overflows this variable
> HINT: this may be a false positive if your program uses some custom stack 
> unwind mechanism, swapcontext or vfork
>       (longjmp and C++ exceptions *are* supported)
> SUMMARY: AddressSanitizer: stack-buffer-overflow ../../src/window.c:1055 in 
> mc_wdrawelm_var
> Shadow bytes around the buggy address:
>   0x1000103a2840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x1000103a2850: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x1000103a2860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x1000103a2870: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x1000103a2880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> =>0x1000103a2890: 00 00 00 00 00 00 00 00 00 00 00 00[f3]f3 f3 f3
>   0x1000103a28a0: f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 f3 00 00 00 00
>   0x1000103a28b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>   0x1000103a28c0: 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1 00 00
>   0x1000103a28d0: 00 f2 00 00 00 f2 f2 f2 00 00 f2 f2 f8 f8 f8 f2
>   0x1000103a28e0: f2 f2 f2 f2 f8 f8 f8 f8 f8 f8 f8 f2 f2 f2 f2 f2
> 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
>   Shadow gap:              cc
> ==3332560==ABORTING
> 
> find_next has:
>  wchar_t tmp_line[MAXCOLS];
> 
> According to gdb inside mc_wdrawelm_var:
> 
> (gdb) p w->x1
> $5 = 0
> (gdb) p w->x2
> $6 = 263
> 
> (other useful stuff like "c" was optimised out.)
> 
> If I add:
> 
>     if (c >= MAXCOLS)
>       abort();
> 
> inside the loop in mc_wdrawelm_var then the process aborts as would be
> expected rather than the sanitizer complaining.
> 
> -- System Information:
> Debian Release: 11.0
>   APT prefers testing-security
>   APT policy: (500, 'testing-security'), (500, 'testing-debug'), (500, 
> 'testing')
> Architecture: amd64 (x86_64)
> Foreign Architectures: i386
> 
> Kernel: Linux 5.10.0-6-amd64 (SMP w/32 CPU threads)
> Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), 
> LANGUAGE=en_GB:en
> Shell: /bin/sh linked to /bin/bash
> Init: systemd (via /run/systemd/system)
> LSM: AppArmor: enabled
> 
> Versions of packages minicom depends on:
> ii  libc6      2.31-12
> ii  libtinfo6  6.2+20201114-2
> 
> Versions of packages minicom recommends:
> ii  lrzsz  0.12.21-10+b1
> 
> minicom suggests no packages.
> 
> -- no debconf information
> 

Reply via email to