RemoteInspection: Skip unused ELF section headers

ELF section headers are allowed to be left uninitialized when the
section is empty and unused. LLD is a tad more aggressive about this.
The ELF reader in the Swift runtime was a bit aggressive about
converting the section headers to names and would not skip over these
unused sections headers resulting in crashes due to operating on
uninitialized memory in the `sh_name` field.

This patch teaches the ELF reader to skip over unused section header
table entries.

(cherry picked from commit 14d2088c75)

 - Explanation: Fixes a bug where we would read uninitialized data from
                unused ELF section headers.
 - Scope: Affects ELF-based platforms and ELF file handling in tools
   like swift-reflection-dump.
 - Risk: Low -- Improves implementation according to the spec.
                Any data used from this was garbage anyway.
 - Testing: Tested on FreeBSD with LLD, which makes uses of unused
            section headers. Ensured that runtime and
            swift-reflection-dump don't crash anymore.
 - Reviewers: @compnerd, @al45tair

Cherry-Pick: https://github.com/swiftlang/swift/pull/82698
This commit is contained in:
Evan Wilde
2025-07-01 14:25:52 -07:00
parent 66d905e25a
commit ad1a33666e

View File

@@ -635,6 +635,9 @@ public:
return {nullptr, 0};
// Now for all the sections, find their name.
for (const typename T::Section *Hdr : SecHdrVec) {
// Skip unused headers
if (Hdr->sh_type == llvm::ELF::SHT_NULL)
continue;
uint32_t Offset = Hdr->sh_name;
const char *Start = (const char *)StrTab + Offset;
uint64_t StringSize = strnlen(Start, StrTabSize - Offset);