Re: [PATCH] invalid-null-argument outmem() src/output.c:149:17

Aleksander Ushakov <[email protected]> Thu, 31 Jul 2025 20:48:49 +0300
Newsgroups org.kernel.vger.dash
Message-ID <[email protected]>
31/07/25 20:33, Aleksander Ushakov wrote:
> Hello Dash maintainers,
> 
> I encountered a bug in Dash in commit b4ef25d7 and would like to report
> it. The details are provided below.
> 
> output.c:149:25: runtime error: null pointer passed as argument 1, which 
> is declared to never be null
> /usr/include/string.h:402:14: note: nonnull attribute specified here
>      #0 0x5f7d3a71f5d6 in outmem /upstream/ubsan/dash/src/output.c:149:17
>      #1 0x5f7d3a720841 in doformat /upstream/ubsan/dash/src/output.c:343:2
>      #2 0x5f7d3a7208f8 in out1fmt /upstream/ubsan/dash/src/output.c:275:2
>      #3 0x5f7d3a721d96 in printfcmd /upstream/ubsan/dash/src/bltin/ 
> printf.c:232:5
>      #4 0x5f7d3a6ddc85 in evalbltin /upstream/ubsan/dash/src/eval.c:975:12
>      #5 0x5f7d3a6d8ef4 in evalcommand /upstream/ubsan/dash/src/eval.c:923:7
>      #6 0x5f7d3a6d60ac in evaltree /upstream/ubsan/dash/src/eval.c:305:12
>      #7 0x5f7d3a70218c in cmdloop /upstream/ubsan/dash/src/main.c:246:8
>      #8 0x5f7d3a701e4b in main /upstream/ubsan/dash/src/main.c:180:3
>      #9 0x724e14494249 in __libc_start_call_main csu/../sysdeps/nptl/ 
> libc_start_call_main.h:58:16
>      #10 0x724e14494304 in __libc_start_main csu/../csu/libc-start.c:360:3
>      #11 0x5f7d3a6a4930 in _start (/upstream/ubsan/dash/src/ 
> dash+0x42930) (BuildId: 096851211111e4d689a2ea0deb5b5d647b8ebd40)
> 
> SUMMARY: UndefinedBehaviorSanitizer: invalid-null-argument output.c:149:25
> 
> 
> Environment:
> 
> Debian-12, x86-64
> clang-19 compiler
> 
> Steps to reproduce:
> 
> ./autogen.sh
> CC=clang CFLAGS=" -fsanitize=undefined -g " ./configure --disable-fnmatch
> --disable-lineno --disable-glob
> make
> cd src
> echo -e '""printf "%s"""' | ./dash


Also the patch fix the problem (just add conditional statement). I'm not 
sure if this affects the translator's functionality.

diff --git a/src/output.c b/src/output.c
index e9ee9b4..e97c570 100644
--- a/src/output.c
+++ b/src/output.c
@@ -146,7 +146,8 @@ outmem(const char *p, size_t len, struct output *dest)
         nleft = dest->end - dest->nextc;
         if (likely(nleft >= len)) {
  buffered:
-               dest->nextc = mempcpy(dest->nextc, p, len);
+               if (dest->nextc)
+                       dest->nextc = mempcpy(dest->nextc, p, len);
                 return;
         }