https://sourceware.org/bugzilla/show_bug.cgi?id=33086
Bug ID: 33086
Summary: objcopy: out-of-memory in
bfd_init_section_compress_status
Product: binutils
Version: 2.44
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: binutils
Assignee: unassigned at sourceware dot org
Reporter: jaehoon.jang at kaist dot ac.kr
Target Milestone: ---
Created attachment 16137
--> https://sourceware.org/bugzilla/attachment.cgi?id=16137&action=edit
objcopy-oom-poc, objcopy-poc-2
Hello, I found some undefined behavior that out-of-memory error in the
elf_map_symbols function, objcopy.
Environment: Ubuntu 22.04
Source code (GitHub): https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git
Commit version (latest):
```
$ git log
commit c0de9d68116d592aaf00d5a6bba177c9499f0949 (HEAD -> master, origin/master,
origin/HEAD)
Author: Jeremy Bryant <[email protected]>
Date: Fri May 2 21:56:35 2025 +0100
* gdb/doc/gdb.texinfo (Emacs): Refer to Emacs manual
The manual section on using GDB under Emacs is out-of-date and
duplicates existing and comprehensive documentation in the Emacs
manual.
Replace the section by a short introduction and reference.
Approved-By: Eli Zaretskii <[email protected]>
```
Reproduction (ASAN Build)
```sh
$ CONFIG_OPTIONS="--disable-shared --disable-gdb \
--disable-libdecnumber --disable-readline \
--disable-sim --disable-ld"
$ CC="clang -g -fsanitize=address" CXX="clang++ -g -fsanitize=address"
./configure $CONFIG_OPTIONS
$ CC="clang -g -fsanitize=address" CXX="clang++ -g -fsanitize=address" make
```
objcopy version
```
$ ./binutils/objcopy --version
GNU objcopy (GNU Binutils) 2.44.50.20250614
Copyright (C) 2025 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.
```
ASAN log
```
./binutils/objcopy --compress-debug-sections /root/objcopy-oom-poc
./binutils/objcopy: /root/objcopy-oom-poc( ): Unable to recognise the
format of file: file format not recognized
=================================================================
==606012==ERROR: AddressSanitizer: allocator is out of memory trying to
allocate 0x6400000000 bytes
#0 0x49c41d in __interceptor_malloc
(/root/realworld-triage/real-binutils-gdb/binutils/objcopy+0x49c41d)
#1 0x532173 in bfd_malloc
/root/realworld-triage/real-binutils-gdb/bfd/libbfd.c:291:9
#2 0x5281e7 in bfd_init_section_compress_status
/root/realworld-triage/real-binutils-gdb/bfd/compress.c:1078:7
==606012==HINT: if you don't care about these errors you may set
allocator_may_return_null=1
SUMMARY: AddressSanitizer: out-of-memory
(/root/realworld-triage/real-binutils-gdb/binutils/objcopy+0x49c41d) in
__interceptor_malloc
==606012==ABORTING
```
Also, when I executed the `objcopy-poc-2` file, I noticed that the memory usage
increased and the program temporarily froze.
```
./binutils/objcopy --compress-debug-sections /root/objcopy-poc-2
(Increased memory usage and pauses)
./binutils/objcopy: /root/objcopy-poc-2(main2.o): Unable to recognise the
format of file: file format not recognized
./binutils/objcopy: warning: /root/stsslJZS/main2.o has a section extending
past end of file
```
Upon simple analysis, it seems that the error occurs when the value of the
`uncompressed_size` variable in the `bfd_compress_section_contents` function
can be set to a very large value, such as 429496729600. I hope this information
helps you debug.
```
Breakpoint 3, bfd_compress_section_contents (abfd=<optimized out>,
sec=<optimized out>) at compress.c:548
548 {
(gdb)
550 uLong compressed_size;
(gdb)
554 int orig_header_size;
(gdb)
555 bfd_size_type uncompressed_size;
(gdb)
556 unsigned int uncompressed_alignment_pow;
(gdb)
557 enum compression_type ch_type = ch_none;
(gdb)
558 int new_header_size = bfd_get_compression_header_size (abfd, NULL);
(gdb)
560 = bfd_is_section_compressed_info (abfd, sec,
(gdb)
568 if (compressed && orig_header_size < 0)
(gdb)
572 if (uncompressed_size == (bfd_size_type) -1)
(gdb)
577 if (!new_header_size)
(gdb) p uncompressed_size
$10 = 429496729600
```
--
You are receiving this mail because:
You are on the CC list for the bug.