[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