Skip to content

Commit 4181db5

Browse files
committed
Add getDynamicStrTab String size check
Signed-off-by: Ruoyu Qiu <cabbaken@outlook.com>
1 parent f1e32bc commit 4181db5

File tree

1 file changed

+11
-25
lines changed

1 file changed

+11
-25
lines changed

llvm/tools/llvm-objdump/ELFDump.cpp

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,22 @@ static Expected<StringRef> getDynamicStrTab(const ELFFile<ELFT> &Elf) {
6363
if (!DynamicEntriesOrError)
6464
return DynamicEntriesOrError.takeError();
6565

66+
typename ELFT::Xword StringTableSize{0};
67+
const uint8_t *MappedAddr{nullptr};
6668
for (const typename ELFT::Dyn &Dyn : *DynamicEntriesOrError) {
6769
if (Dyn.d_tag == ELF::DT_STRTAB) {
6870
auto MappedAddrOrError = Elf.toMappedAddr(Dyn.getPtr());
6971
if (!MappedAddrOrError)
7072
return MappedAddrOrError.takeError();
71-
return StringRef(reinterpret_cast<const char *>(*MappedAddrOrError));
73+
MappedAddr = *MappedAddrOrError;
74+
}
75+
if (Dyn.d_tag == ELF::DT_STRSZ) {
76+
StringTableSize = Dyn.getVal();
7277
}
7378
}
79+
if (MappedAddr && StringTableSize)
80+
return StringRef(reinterpret_cast<const char *>(MappedAddr),
81+
StringTableSize);
7482

7583
// If the dynamic segment is not present, we fall back on the sections.
7684
auto SectionsOrError = Elf.sections();
@@ -221,28 +229,6 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
221229
std::string TagFmt = " %-" + std::to_string(MaxLen) + "s ";
222230

223231
outs() << "\nDynamic Section:\n";
224-
typename ELFT::Xword StringTableSize{0};
225-
for (const typename ELFT::Shdr &Sec : cantFail(Elf.sections())) {
226-
if (Sec.sh_type == ELF::SHT_DYNAMIC || Sec.sh_type == ELF::SHT_DYNSYM) {
227-
Expected<const typename ELFT::Shdr *> StringTableSecOrError =
228-
getSection<ELFT>(cantFail(Elf.sections()), Sec.sh_link);
229-
if (!StringTableSecOrError) {
230-
reportWarning(toString(StringTableSecOrError.takeError()),
231-
Obj.getFileName());
232-
continue;
233-
}
234-
StringTableSize = StringTableSize < (*StringTableSecOrError)->sh_size
235-
? (*StringTableSecOrError)->sh_size
236-
: StringTableSize;
237-
}
238-
}
239-
for (const typename ELFT::Dyn &Dyn : DynamicEntries) {
240-
if (Dyn.d_tag == ELF::DT_STRSZ) {
241-
StringTableSize =
242-
StringTableSize < Dyn.getVal() ? Dyn.getVal() : StringTableSize;
243-
break;
244-
}
245-
}
246232

247233
for (const typename ELFT::Dyn &Dyn : DynamicEntries) {
248234
if (Dyn.d_tag == ELF::DT_NULL)
@@ -258,9 +244,9 @@ template <class ELFT> void ELFDumper<ELFT>::printDynamicSection() {
258244
Expected<StringRef> StrTabOrErr = getDynamicStrTab(Elf);
259245
if (StrTabOrErr) {
260246
const char *Data = StrTabOrErr->data();
261-
if (Dyn.getVal() >= StringTableSize) {
247+
if (Dyn.getVal() >= StrTabOrErr->size()) {
262248
reportWarning("invalid string table offset, string table size: 0x" +
263-
Twine::utohexstr(StringTableSize),
249+
Twine::utohexstr(StrTabOrErr->size()),
264250
Obj.getFileName());
265251
outs() << format(TagFmt.c_str(), Str.c_str())
266252
<< format(Fmt, (uint64_t)Dyn.getVal());

0 commit comments

Comments
 (0)