From 27e651d4f69527b12d02e1f02dd6da9f423f1d4d Mon Sep 17 00:00:00 2001 From: George Rimar Date: Mon, 10 Oct 2016 10:31:03 +0000 Subject: [PATCH] Recommit r283733 "[ELF] - Do not crash if common symbol alignment set to value greater than UINT32_MAX. With fix: commit changes from InputFiles.cpp too. Original commit message: We have following code in lld, that truncates the alignment value to 32 bit. Big alignment in this case may give result 0 and crash later. template CommonInputSection::CommonInputSection(std::vector Syms) : InputSection(nullptr, &Hdr, "") { .... for (DefinedCommon *Sym : Syms) { this->Alignment = std::max(this->Alignment, Sym->Alignment); ... } } Patch fixes the issue. Differential revision: https://reviews.llvm.org/D25235 llvm-svn: 283738 --- lld/ELF/InputFiles.cpp | 4 ++-- lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elf | Bin 0 -> 456 bytes lld/test/ELF/invalid/common-symbol-alignment.s | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elf diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index cc8a849..e3266f1 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -437,9 +437,9 @@ SymbolBody *elf::ObjectFile::createSymbolBody(const Elf_Sym *Sym) { /*CanOmitFromDynSym*/ false, this) ->body(); case SHN_COMMON: - if (Sym->st_value == 0) + if (Sym->st_value == 0 || Sym->st_value >= UINT32_MAX) fatal(getFilename(this) + ": common symbol '" + Name + - "' alignment is 0"); + "' has invalid alignment: " + Twine(Sym->st_value)); return elf::Symtab::X->addCommon(Name, Sym->st_size, Sym->st_value, Binding, Sym->st_other, Sym->getType(), this) diff --git a/lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elf b/lld/test/ELF/invalid/Inputs/common-symbol-alignment2.elf new file mode 100644 index 0000000000000000000000000000000000000000..21c2457cbea161b5d55cc44cfaa5c747f8e936b6 GIT binary patch literal 456 zcmb<-^>JfjWMqH=Mg}_u1P><4z;FV=WN-kp9T-@!s)Q(H2U0=|pZ?o}07M8(%7ew3 zkVGI%ZXhMVfGN(PSCU#$!jP0$#88!*!k|}NQdE+d1f(l-K{Qa@2*WIL1o(lPn6YSF w02Na~lS2<95Fdou(9}7g@nKvR7z0X+18FS2hlVu+LjqJC%pMLXUjj-400h(%$p8QV literal 0 HcmV?d00001 diff --git a/lld/test/ELF/invalid/common-symbol-alignment.s b/lld/test/ELF/invalid/common-symbol-alignment.s index 671205f..2a654b1 100644 --- a/lld/test/ELF/invalid/common-symbol-alignment.s +++ b/lld/test/ELF/invalid/common-symbol-alignment.s @@ -3,4 +3,10 @@ ## common-symbol-alignment.elf contains common symbol with zero alignment. # RUN: not ld.lld %S/Inputs/common-symbol-alignment.elf \ # RUN: -o %t 2>&1 | FileCheck %s -# CHECK: common symbol 'bar' alignment is 0 +# CHECK: common symbol 'bar' has invalid alignment: 0 + +## common-symbol-alignment2.elf contains common symbol alignment greater +## than UINT32_MAX. +# RUN: not ld.lld %S/Inputs/common-symbol-alignment2.elf \ +# RUN: -o %t 2>&1 | FileCheck %s --check-prefix=BIG +# BIG: common symbol 'bar' has invalid alignment: 271644049215 -- 2.7.4