[gcc r17-2849] c++: ICE on on systems without mmap support [PR124806]

Torbjorn Svensson via Gcc-cvs <[email protected]> Fri, 31 Jul 2026 09:02:57 +0000 (GMT)
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:94556938452d2bde01f5954207294906bbb53d8f

commit r17-2849-g94556938452d2bde01f5954207294906bbb53d8f
Author: Torbjörn SVENSSON <[email protected]>
Date:   Sun Jul 26 23:25:50 2026 +0200

    c++: ICE on on systems without mmap support [PR124806]
    
    On systems without mmap support, cc1plus can crash when finishing module
    output after earlier errors prevented elf_out::begin from running.  In
    that case elf_out::end attempts to fill in the ELF header even though
    hdr.buffer was never initialized.
    
    gcc/cp/ChangeLog:
    
            PR c++/124806
            * module.cc (elf_out::began): New data member.
            (elf_out::begin): Set it after successful initialization.
            (elf_out::end): Do not finalize output that never began.
    
    Signed-off-by: Torbjörn SVENSSON <[email protected]>

Diff:
---
 gcc/cp/module.cc | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index 49a47494467c..d6bd4c78d804 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -1511,6 +1511,7 @@ class elf_out : public elf, public data::allocator {
 private:
   ptr_int_hash_map identtab;	/* Map of IDENTIFIERS to strtab offsets. */
   unsigned pos;			/* Write position in file.  */
+  bool began;			/* True if begin initialized output state.  */
 #if MAPPED_WRITING
   unsigned offset;		/* Offset of the mapping.  */
   unsigned extent;		/* Length of mapping.  */
@@ -1519,7 +1520,7 @@ private:
 
 public:
   elf_out (int fd, int e)
-    :parent (fd, e), identtab (500), pos (0)
+    :parent (fd, e), identtab (500), pos (0), began (false)
   {
 #if MAPPED_WRITING
     offset = extent = 0;
@@ -2231,7 +2232,10 @@ elf_out::begin ()
   memset (h, 0, sizeof (header));
   hdr.pos = hdr.size;
   write (hdr);
-  return !get_error ();
+  if (get_error ())
+    return false;
+  began = true;
+  return true;
 }
 
 /* Finish writing the file.  Write out the string & section tables.
@@ -2240,7 +2244,7 @@ elf_out::begin ()
 bool
 elf_out::end ()
 {
-  if (fd >= 0)
+  if (fd >= 0 && began)
     {
       /* Write the string table.  */
       unsigned strnam = name (".strtab");