[llvm] [BOLT] Add guardrails around reading malformed input (PR #192348)
Rafael Auler via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 15 14:47:12 PDT 2026
https://github.com/rafaelauler created https://github.com/llvm/llvm-project/pull/192348
None
>From 41d96d5ec30c84ffba1112f444895800d5633e4f Mon Sep 17 00:00:00 2001
From: Rafael Auler <rafaelauler at fb.com>
Date: Wed, 15 Apr 2026 14:42:59 -0700
Subject: [PATCH] [BOLT] Add guardrails around reading malformed input
---
bolt/lib/Rewrite/RewriteInstance.cpp | 35 +++++++++++++++++++++-------
1 file changed, 27 insertions(+), 8 deletions(-)
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 33b0ec524e800..d54ce2229a051 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -2546,11 +2546,26 @@ bool RewriteInstance::analyzeRelocation(
IsSectionRelocation = false;
} else {
const SymbolRef &Symbol = *SymbolIter;
- SymbolName = std::string(cantFail(Symbol.getName()));
- SymbolAddress = cantFail(Symbol.getAddress());
- SkipVerification = (cantFail(Symbol.getType()) == SymbolRef::ST_Other);
+ Expected<StringRef> NameOrErr = Symbol.getName();
+ if (!NameOrErr) {
+ consumeError(NameOrErr.takeError());
+ return false;
+ }
+ SymbolName = std::string(*NameOrErr);
+ Expected<uint64_t> AddrOrErr = Symbol.getAddress();
+ if (!AddrOrErr) {
+ consumeError(AddrOrErr.takeError());
+ return false;
+ }
+ SymbolAddress = *AddrOrErr;
+ Expected<SymbolRef::Type> TypeOrErr = Symbol.getType();
+ if (!TypeOrErr) {
+ consumeError(TypeOrErr.takeError());
+ return false;
+ }
+ SkipVerification = (*TypeOrErr == SymbolRef::ST_Other);
// Section symbols are marked as ST_Debug.
- IsSectionRelocation = (cantFail(Symbol.getType()) == SymbolRef::ST_Debug);
+ IsSectionRelocation = (*TypeOrErr == SymbolRef::ST_Debug);
// Check for PLT entry registered with symbol name
if (!SymbolAddress && !IsWeakReference(Symbol) &&
(IsAArch64 || BC->isRISCV())) {
@@ -3015,10 +3030,14 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
symbol_iterator SymbolIter = Rel.getSymbol();
if (SymbolIter != InputFile->symbol_end()) {
SymbolRef Symbol = *SymbolIter;
- section_iterator Section =
- cantFail(Symbol.getSection(), "cannot get symbol section");
- if (Section != InputFile->section_end()) {
- Expected<StringRef> SectionName = Section->getName();
+ Expected<section_iterator> SectionOrErr = Symbol.getSection();
+ if (!SectionOrErr) {
+ BC->errs() << "BOLT-WARNING: unable to get section for relocation symbol"
+ << " at offset 0x"
+ << Twine::utohexstr(Rel.getOffset()) << '\n';
+ consumeError(SectionOrErr.takeError());
+ } else if (*SectionOrErr != InputFile->section_end()) {
+ Expected<StringRef> SectionName = (*SectionOrErr)->getName();
if (SectionName && !SectionName->empty())
ReferencedSection = BC->getUniqueSectionByName(*SectionName);
} else if (BC->isRISCV() && ReferencedSymbol && ContainingBF &&
More information about the llvm-commits
mailing list