bfd: Avoid signed overflow for new_size adjustment
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 6 Dec 2022 20:54:43 +0000 (12:54 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 6 Dec 2022 22:47:44 +0000 (14:47 -0800)
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.

bfd/compress.c

index bb55a6ec0ac656a509882afdae2b4c81e649baf9..5ea7cd95f3a7d9cc819237e81d2bf84510496a69 100644 (file)
@@ -306,7 +306,7 @@ bfd_convert_section_setup (bfd *ibfd, asection *isec, bfd *obfd,
   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;
 }