Re: [PATCH v2 1/1] c++: ICE on on systems without mmap support [PR124806]

Christophe Lyon <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>

On 7/31/26 11:04, Torbjorn SVENSSON wrote:
> 
> 
> On 2026-07-31 05:31, Jason Merrill wrote:
>> On 7/29/26 8:03 AM, Torbjörn Svensson via Sourceware Forge wrote:
>>> From: Torbjörn SVENSSON <[email protected]>
>>>
>>> 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::begun): New data member.
>>
>> Let's call it "began" to match the one in module_processing_cookie.  I 
>> thought about trying to share that one flag, but I suppose it's 
>> probably necessary to distinguish between elf_out::begin and 
>> module_state::begin.
>>
>> OK with that tweak.
> 
> Renamed the member.
> 
> Pushed as r17-2849-g94556938452d2b.
> I'll push to releases/gcc-16 and releases/gcc-15 in a few days unless 
> someone objects.
> 

Note that gcc-16 is currently frozen.

Thanks,

Christophe


> Kind regards,
> Torbjörn
> 
>>
>>>     (elf_out::begin): Set it after successful initialization.
>>>     (elf_out::end): Do not finalize output that was never begun.
>>>
>>> Signed-off-by: Torbjörn SVENSSON <[email protected]>
>>> ---
>>>   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 f7569e688a26..156df4457463 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 begun;            /* 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), begun (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;
>>> +  begun = 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 && begun)
>>>       {
>>>         /* Write the string table.  */
>>>         unsigned strnam = name (".strtab");
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.