When bfd_size_type is unsigned 64-bit integer and sizeof is unsigned
32-bit integer, subtraction in
*new_size += sizeof (Elf32_External_Chdr) - sizeof (Elf64_External_Chdr);
will overflow. Use
*new_size -= sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr);
to avoid overflow.
PR binutils/29860
* compress.c (bfd_convert_section_setup): Avoid signed overflow
for new_size adjustment.
if (hdr_size == sizeof (Elf32_External_Chdr))
*new_size += sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr);
else
- *new_size += sizeof (Elf32_External_Chdr) - sizeof (Elf64_External_Chdr);
+ *new_size -= sizeof (Elf64_External_Chdr) - sizeof (Elf32_External_Chdr);
return true;
}