On Mon, Feb 25 2019, Jeremie Courreges-Anglas <[email protected]> wrote:
> +cc sthen since ports/textproc/mupdf is affected by the bug:
>
>   http://build-failures.rhaalovely.net//sparc64/2019-02-03/textproc/mupdf.log
>
> On Sun, Feb 24 2019, Jeremie Courreges-Anglas <[email protected]> wrote:
>> On Sat, Feb 23 2019, Aaron Miller <[email protected]> wrote:
>>> On February 23, 2019 2:50:46 AM PST, Jeremie Courreges-Anglas 
>>> <[email protected]> wrote:
>>>>On Sat, May 07 2016, Stefan Kempf <[email protected]> wrote:
>>
>> [...]
>>
>>> Hi Jeremie,
>>>
>>> That is concerning. I'm on my phone and haven't had a chance to 
>>> investigate, but from the code in the gdb output above, it looks like the 
>>> author of the diff forgot to set the pointer to NULL after freeing. For 
>>> example:
>>>             if (elf_tdata (sub)->symbuf) {
>>>               free (elf_tdata (sub)->symbuf);
>>>               elf_tdata (sub)->symbuf = NULL;
>>>             }
>>>
>>> This is not tested at all. I hope this works! 
>>
>> It doesn't, which is consistent with the error seen with
>> MALLOC_OPTIONS=S: "free (ptr=0xdbdbdbdbdbdbdbdb)" points out that the
>> code uses uninitialized memory (0xdb).  The 0xdf pattern in the sparc64
>> build failure is likely newly allocated, uninitialized memory which
>> had previously been junked by free(3).
>
> The following diff fixes the issue here.  The "bfd_get_flavour (sub) ==
> bfd_target_elf_flavour" check is the important part, it mirrors the
> checks done in bfd_elf_match_symbols_in_sections().
>
> The "symbuf = NULL" part is not needed to avoid the crash, but if it can
> avoid someone another dive in this codebase, I think it's worth it. ;)
>
> Quick way to test the diff:
>
>   MALLOC_OPTIONS=S ld.bfd -r -b binary ~/.profile -o /tmp/garbage
>
> ok?

Still looking for feedback.  textproc/mupdf being broken knocks out cups
and its consumers in bulk builds, this is not nice.  I'll commit this on
sunday unless I hear objections.

> Index: bfd/elflink.c
> ===================================================================
> RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/bfd/elflink.c,v
> retrieving revision 1.22
> diff -u -p -r1.22 elflink.c
> --- bfd/elflink.c     3 Dec 2018 02:59:51 -0000       1.22
> +++ bfd/elflink.c     25 Feb 2019 09:49:05 -0000
> @@ -8619,8 +8619,13 @@ bfd_elf_final_link (bfd *abfd, struct bf
>    if (!info->reduce_memory_overheads)
>      {
>        for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
> -     if (elf_tdata (sub)->symbuf)
> -       free (elf_tdata (sub)->symbuf);
> +        {
> +          if (bfd_get_flavour (sub) == bfd_target_elf_flavour)
> +            {
> +              free (elf_tdata (sub)->symbuf);
> +              elf_tdata (sub)->symbuf = NULL;
> +            }
> +        }
>      }
>  
>    /* Output any global symbols that got converted to local in a

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to