binutils: Fix CVE-2025-7545

objcopy: Don't extend the output section size
Since the output section contents are copied from the input, don't
extend the output section size beyond the input section size.

Backport a patch from upstream to fix CVE-2025-7545
Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=patch;h=08c3cbe5926e4d355b5cb70bbec2b1eeb40c2944]

(From OE-Core rev: 4f461ed46b7694fc4815c7f0504b9cefe5da8e19)

Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
Signed-off-by: Steve Sakoman <steve@sakoman.com>
This commit is contained in:
Deepesh Varatharajan
2025-07-29 02:15:32 -07:00
committed by Steve Sakoman
parent 7a75b9b4a7
commit 31dd8d47a6
2 changed files with 40 additions and 0 deletions

View File

@@ -79,5 +79,6 @@ SRC_URI = "\
file://0041-CVE-2025-5244.patch \
file://0042-CVE-2025-5245.patch \
file://0043-CVE-2025-7546.patch \
file://0043-CVE-2025-7545.patch \
"
S = "${WORKDIR}/git"

View File

@@ -0,0 +1,39 @@
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Sat, 21 Jun 2025 06:36:56 +0800
Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=patch;h08c3cbe5926e4d355b5cb70bbec2b1eeb40c2944]
CVE: CVE-2025-7545
Since the output section contents are copied from the input, don't
extend the output section size beyond the input section size.
PR binutils/33049
* objcopy.c (copy_section): Don't extend the output section
size beyond the input section size.
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index d53aa5c6..874f163b 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -4444,6 +4444,7 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
char *to = (char *) memhunk;
char *end = (char *) memhunk + size;
int i;
+ bfd_size_type memhunk_size = size;
/* If the section address is not exactly divisible by the interleave,
then we must bias the from address. If the copy_byte is less than
@@ -4463,6 +4464,11 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
}
size = (size + interleave - 1 - copy_byte) / interleave * copy_width;
+
+ /* Don't extend the output section size. */
+ if (size > memhunk_size)
+ size = memhunk_size;
+
osection->lma /= interleave;
if (copy_byte < extra)
osection->lma++;