gbranden pushed a commit to branch master
in repository groff.

commit e8e78aad57634640d1cab556cadc2ca800cca220
Author: Bruno Haible <[email protected]>
AuthorDate: Sun Aug 2 13:54:53 2026 +0200

    pic: Fix undefined behaviour, part 2.
    
    This change fixes this ASAN finding:
    
    ERROR: AddressSanitizer: alloc-dealloc-mismatch (malloc vs operator delete 
[]) on 0x6db4f9de0790
        #0 0x609b694769ed in operator delete[](void*) 
/home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:179:46
        #1 0x609b694c553f in command_object::~command_object() 
/devel/groff/src/preproc/pic/object.cpp:488:3
        #2 0x609b694c5594 in command_object::~command_object() 
/devel/groff/src/preproc/pic/object.cpp:487:1
        #3 0x609b694a7450 in parse_cleanup() 
/devel/groff/src/preproc/pic/pic.ypp:1918:5
        #4 0x609b694bf43e in do_picture(_IO_FILE*) 
/devel/groff/src/preproc/pic/main.cpp:303:5
        #5 0x609b694bdf4f in do_file(char const*) 
/devel/groff/src/preproc/pic/main.cpp:395:2
        #6 0x609b694c0241 in main /devel/groff/src/preproc/pic/main.cpp:691:7
    
    0x6db4f9de0790 is located 0 bytes inside of 7-byte region 
[0x6db4f9de0790,0x6db4f9de0797)
    allocated by thread T0 here:
        #0 0x609b69432ee4 in malloc 
/home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:67:3
        #1 0x609b69514657 in strsave(char const*) 
/devel/groff/src/libs/libgroff/strsave.cpp:36:33
        #2 0x609b694b6c03 in yylex() 
/devel/groff/src/preproc/pic/lex.cpp:1916:25
        #3 0x609b6947b944 in yyparse() 
/devel/groff/src/preproc/pic/pic.cpp:2354:16
        #4 0x609b694bf3e0 in do_picture(_IO_FILE*) 
/devel/groff/src/preproc/pic/main.cpp:299:9
        #5 0x609b694bdf4f in do_file(char const*) 
/devel/groff/src/preproc/pic/main.cpp:395:2
        #6 0x609b694c0241 in main /devel/groff/src/preproc/pic/main.cpp:691:7
    
    SUMMARY: AddressSanitizer: alloc-dealloc-mismatch 
/devel/groff/src/preproc/pic/object.cpp:488:3 in 
command_object::~command_object()
    
    * src/preproc/pic/object.cpp (command_object::~command_object): Free the
    s field using free(), not delete[].
---
 src/preproc/pic/object.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/preproc/pic/object.cpp b/src/preproc/pic/object.cpp
index 32255a850..a57329235 100644
--- a/src/preproc/pic/object.cpp
+++ b/src/preproc/pic/object.cpp
@@ -468,7 +468,7 @@ object_spec::~object_spec()
 }
 
 class command_object : public object {
-  char *s;
+  char *s;              // to be freed with free()
   const char *filename;
   int lineno;
 public:
@@ -485,7 +485,7 @@ command_object::command_object(char *p, const char *fn, int 
ln)
 
 command_object::~command_object()
 {
-  delete[] s;
+  free(s);
 }
 
 void command_object::print()

_______________________________________________
groff-commit mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/groff-commit

Reply via email to