forked from OSchip/llvm-project
Next set of additional error checks for invalid Mach-O files for the
load commands that uses the MachO::linker_option_command type but not used in llvm libObject code but used in llvm tool code. This includes just LC_LINKER_OPTION load command. llvm-svn: 283939
This commit is contained in:
parent
f4876beb2b
commit
68fffa8a62
|
@ -722,6 +722,39 @@ static Error checkEncryptCommand(const MachOObjectFile *Obj,
|
|||
return Error::success();
|
||||
}
|
||||
|
||||
static Error checkLinkerOptCommand(const MachOObjectFile *Obj,
|
||||
const MachOObjectFile::LoadCommandInfo &Load,
|
||||
uint32_t LoadCommandIndex) {
|
||||
if (Load.C.cmdsize < sizeof(MachO::linker_option_command))
|
||||
return malformedError("load command " + Twine(LoadCommandIndex) +
|
||||
" LC_LINKER_OPTION cmdsize too small");
|
||||
MachO::linker_option_command L =
|
||||
getStruct<MachO::linker_option_command>(Obj, Load.Ptr);
|
||||
// Make sure the count of strings is correct.
|
||||
const char *string = (const char *)Load.Ptr +
|
||||
sizeof(struct MachO::linker_option_command);
|
||||
uint32_t left = L.cmdsize - sizeof(struct MachO::linker_option_command);
|
||||
uint32_t i = 0;
|
||||
while (left > 0) {
|
||||
while (*string == '\0' && left > 0) {
|
||||
string++;
|
||||
left--;
|
||||
}
|
||||
if (left > 0) {
|
||||
i++;
|
||||
uint32_t NullPos = StringRef(string, left).find('\0');
|
||||
uint32_t len = std::min(NullPos, left) + 1;
|
||||
string += len;
|
||||
left -= len;
|
||||
}
|
||||
}
|
||||
if (L.count != i)
|
||||
return malformedError("load command " + Twine(LoadCommandIndex) +
|
||||
" LC_LINKER_OPTION string count " + Twine(L.count) +
|
||||
" does not match number of strings");
|
||||
return Error::success();
|
||||
}
|
||||
|
||||
Expected<std::unique_ptr<MachOObjectFile>>
|
||||
MachOObjectFile::create(MemoryBufferRef Object, bool IsLittleEndian,
|
||||
bool Is64Bits) {
|
||||
|
@ -950,6 +983,9 @@ MachOObjectFile::MachOObjectFile(MemoryBufferRef Object, bool IsLittleEndian,
|
|||
if ((Err = checkEncryptCommand(this, Load, I, E.cryptoff, E.cryptsize,
|
||||
&EncryptLoadCmd, "LC_ENCRYPTION_INFO_64")))
|
||||
return;
|
||||
} else if (Load.C.cmd == MachO::LC_LINKER_OPTION) {
|
||||
if ((Err = checkLinkerOptCommand(this, Load, I)))
|
||||
return;
|
||||
}
|
||||
if (I < LoadCommandCount - 1) {
|
||||
if (auto LoadOrErr = getNextLoadCommandInfo(this, I, Load))
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -349,3 +349,9 @@ INVALID-ENCRYPT-CRYPTOFF: macho-invalid-encrypt-cryptoff': truncated or malforme
|
|||
|
||||
RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho-invalid-encrypt64-cryptoff-cryptsize 2>&1 | FileCheck -check-prefix INVALID-ENCRYPT-CRYPTOFF-CRYPTSIZE %s
|
||||
INVALID-ENCRYPT-CRYPTOFF-CRYPTSIZE: macho-invalid-encrypt64-cryptoff-cryptsize': truncated or malformed object (cryptoff field plus cryptsize field of LC_ENCRYPTION_INFO_64 command 0 extends past the end of the file)
|
||||
|
||||
RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho-invalid-linkopt-bad-size 2>&1 | FileCheck -check-prefix INVALID-LINKOPT-BAD-SIZE %s
|
||||
INVALID-LINKOPT-BAD-SIZE: macho-invalid-linkopt-bad-size': truncated or malformed object (load command 0 LC_LINKER_OPTION cmdsize too small)
|
||||
|
||||
RUN: not llvm-objdump -macho -private-headers %p/Inputs/macho-invalid-linkopt-bad-count 2>&1 | FileCheck -check-prefix INVALID-LINKOPT-BAD-COUNT %s
|
||||
INVALID-LINKOPT-BAD-COUNT: macho-invalid-linkopt-bad-count': truncated or malformed object (load command 0 LC_LINKER_OPTION string count 3 does not match number of strings)
|
||||
|
|
Loading…
Reference in New Issue