gbranden pushed a commit to branch master
in repository groff.

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

    tbl: Fix undefined behaviour.
    
    This change fixes ASAN findings such as:
    
    ERROR: AddressSanitizer: alloc-dealloc-mismatch (malloc vs operator delete 
[]) on 0x6f5aaafeb4e0
        #0 0x5a98c9ab586d in operator delete[](void*) 
/home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:179:46
        #1 0x5a98c9ad6eaf in block_entry::~block_entry() 
/devel/groff/src/preproc/tbl/table.cpp:667:3
        #2 0x5a98c9b0cad4 in left_block_entry::~left_block_entry() 
/devel/groff/src/preproc/tbl/table.cpp:334:7
        #3 0x5a98c9b0cb24 in left_block_entry::~left_block_entry() 
/devel/groff/src/preproc/tbl/table.cpp:334:7
        #4 0x5a98c9ae6f36 in table::~table() 
/devel/groff/src/preproc/tbl/table.cpp:1310:5
        #5 0x5a98c9ab89fc in process_table(table_input&) 
/devel/groff/src/preproc/tbl/main.cpp:1677:5
        #6 0x5a98c9ab7da7 in process_input_file(_IO_FILE*) 
/devel/groff/src/preproc/tbl/main.cpp:270:4
        #7 0x5a98c9acdc9e in main /devel/groff/src/preproc/tbl/main.cpp:1792:5
    
    0x6f5aaafeb4e0 is located 0 bytes inside of 62-byte region 
[0x6f5aaafeb4e0,0x6f5aaafeb51e)
    allocated by thread T0 here:
        #0 0x5a98c9a71f39 in calloc 
/home/runner/work/llvm-project/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:74:3
        #1 0x5a98c9b15f2a in string::extract() const 
/devel/groff/src/libs/libgroff/string.cpp:384:33
        #2 0x5a98c9aed448 in table::add_entry(int, int, string const&, 
entry_format const*, char const*, int) 
/devel/groff/src/preproc/tbl/table.cpp:1546:17
        #3 0x5a98c9acabf6 in process_data(table_input&, format*, options*) 
/devel/groff/src/preproc/tbl/main.cpp:1577:13
        #4 0x5a98c9ab8972 in process_table(table_input&) 
/devel/groff/src/preproc/tbl/main.cpp:1675:17
        #5 0x5a98c9ab7da7 in process_input_file(_IO_FILE*) 
/devel/groff/src/preproc/tbl/main.cpp:270:4
        #6 0x5a98c9acdc9e in main /devel/groff/src/preproc/tbl/main.cpp:1792:5
    
    SUMMARY: AddressSanitizer: alloc-dealloc-mismatch 
/devel/groff/src/preproc/tbl/table.cpp:667:3 in block_entry::~block_entry()
    
    * src/preproc/tbl/table.cpp (block_entry::~block_entry): Free the contents
    field using free(), not delete[].
---
 src/preproc/tbl/table.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/preproc/tbl/table.cpp b/src/preproc/tbl/table.cpp
index bd0abcda6..392b41ad3 100644
--- a/src/preproc/tbl/table.cpp
+++ b/src/preproc/tbl/table.cpp
@@ -214,7 +214,7 @@ public:
 
 class text_entry : public simple_entry {
 protected:
-  char *contents;
+  char *contents;             // to be freed with free()
   void print_contents();
 public:
   text_entry(const table *, const entry_modifier *, char *);
@@ -319,7 +319,7 @@ public:
 };
 
 class block_entry : public table_entry {
-  char *contents;
+  char *contents;             // to be freed with free()
 protected:
   void do_divert(int, int, const string *, int *, int);
 public:
@@ -664,7 +664,7 @@ block_entry::block_entry(const table *p, const 
entry_modifier *m,
 
 block_entry::~block_entry()
 {
-  delete[] contents;
+  free(contents);
 }
 
 void block_entry::position_vertically()

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

Reply via email to