diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2022-03-05 14:16:17 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2022-05-14 11:46:11 +0000 |
| commit | d781ede639f2289ccf0889dd138169e1194b656b (patch) | |
| tree | fb34a940b224dca9f5e7bdb8eb503e6acbd22b0f /contrib/llvm-project/llvm/tools/llvm-objcopy | |
| parent | d56accc7c3dcc897489b6a07834763a03b9f3d68 (diff) | |
| parent | 1ff3a73c1ece7a0a4b7a8457eb4d5c47334b1526 (diff) | |
Diffstat (limited to 'contrib/llvm-project/llvm/tools/llvm-objcopy')
| -rw-r--r-- | contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.cpp | 21 | ||||
| -rw-r--r-- | contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.h | 2 |
2 files changed, 16 insertions, 7 deletions
diff --git a/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.cpp b/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.cpp index cbd0e4261238..fcbfef96d860 100644 --- a/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.cpp +++ b/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.cpp @@ -116,7 +116,7 @@ void COFFWriter::layoutSections() { } } -size_t COFFWriter::finalizeStringTable() { +Expected<size_t> COFFWriter::finalizeStringTable() { for (const auto &S : Obj.getSections()) if (S.Name.size() > COFF::NameSize) StrTabBuilder.add(S.Name); @@ -129,11 +129,16 @@ size_t COFFWriter::finalizeStringTable() { for (auto &S : Obj.getMutableSections()) { memset(S.Header.Name, 0, sizeof(S.Header.Name)); - if (S.Name.size() > COFF::NameSize) { - snprintf(S.Header.Name, sizeof(S.Header.Name), "/%d", - (int)StrTabBuilder.getOffset(S.Name)); - } else { + if (S.Name.size() <= COFF::NameSize) { + // Short names can go in the field directly. memcpy(S.Header.Name, S.Name.data(), S.Name.size()); + } else { + // Offset of the section name in the string table. + size_t Offset = StrTabBuilder.getOffset(S.Name); + if (!COFF::encodeSectionName(S.Header.Name, Offset)) + return createStringError(object_error::invalid_section_index, + "COFF string table is greater than 64GB, " + "unable to encode section name offset"); } } for (auto &S : Obj.getMutableSymbols()) { @@ -219,7 +224,11 @@ Error COFFWriter::finalize(bool IsBigObj) { Obj.PeHeader.CheckSum = 0; } - size_t StrTabSize = finalizeStringTable(); + Expected<size_t> StrTabSizeOrErr = finalizeStringTable(); + if (!StrTabSizeOrErr) + return StrTabSizeOrErr.takeError(); + + size_t StrTabSize = *StrTabSizeOrErr; size_t PointerToSymbolTable = FileSize; // StrTabSize <= 4 is the size of an empty string table, only consisting diff --git a/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.h b/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.h index eed43b3e5814..5758aadb5439 100644 --- a/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.h +++ b/contrib/llvm-project/llvm/tools/llvm-objcopy/COFF/Writer.h @@ -35,7 +35,7 @@ class COFFWriter { Error finalizeRelocTargets(); Error finalizeSymbolContents(); void layoutSections(); - size_t finalizeStringTable(); + Expected<size_t> finalizeStringTable(); Error finalize(bool IsBigObj); |
