From 52838297074b39e78c528efc0f3683fe6fb42dd4 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 28 Aug 2014 04:02:50 +0000 Subject: [PATCH] MC: Don't crash when the COFF section limit is reached I've decided not to commit a test, it takes 2.5 seconds to run on my an incredibly strong machine. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216647 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/WinCOFFObjectWriter.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 824895be32d..2de65c798be 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/lib/MC/WinCOFFObjectWriter.cpp @@ -840,18 +840,23 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm, void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout) { // Assign symbol and section indexes and offsets. - Header.NumberOfSections = 0; + size_t NumberOfSections = 0; DenseMap SectionIndices; - for (auto & Section : Sections) { - size_t Number = ++Header.NumberOfSections; - SectionIndices[Section.get()] = Number; + for (const auto &Section : Sections) { + size_t Number = ++NumberOfSections; + SectionIndices[Section.get()] = static_cast(Number); MakeSectionReal(*Section, Number); } + if (NumberOfSections > COFF::MaxNumberOfSections) + report_fatal_error( + "PE COFF object files can't have more than 65,299 sections"); + + Header.NumberOfSections = static_cast(NumberOfSections); Header.NumberOfSymbols = 0; - for (auto & Symbol : Symbols) { + for (auto &Symbol : Symbols) { // Update section number & offset for symbols that have them. if (Symbol->Section) Symbol->Data.SectionNumber = Symbol->Section->Number; @@ -929,7 +934,7 @@ void WinCOFFObjectWriter::WriteObject(MCAssembler &Asm, bool RelocationsOverflow = Sec->Relocations.size() >= 0xffff; if (RelocationsOverflow) { - // Signal overflow by setting NumberOfSections to max value. Actual + // Signal overflow by setting NumberOfRelocations to max value. Actual // size is found in reloc #0. Microsoft tools understand this. Sec->Header.NumberOfRelocations = 0xffff; } else { -- 2.34.1