bionic: ReadPadSegmentNote: Skip empty PT_NOTEs Some obfuscated ELFs may containe "empty" PT_NOTEs (p_memsz == 0). Attempting to mmap these will cause a EINVAL failure since the requested mapping size is zero. Skip these phrogram headers when parsing notes. Also improve the failure log with arguments to the mmap syscall. Test: Platinum Tests Bug: 324468126 Change-Id: I7de4e55c6d221d555faabfcc33bb6997921dd022 Signed-off-by: Kalesh Singh <kaleshsingh@google.com>
diff --git a/linker/linker_phdr.cpp b/linker/linker_phdr.cpp index 8925e62..60f8868 100644 --- a/linker/linker_phdr.cpp +++ b/linker/linker_phdr.cpp
@@ -717,13 +717,20 @@ continue; } + // Some obfuscated ELFs may contain "empty" PT_NOTE program headers that don't + // point to any part of the ELF (p_memsz == 0). Skip these since there is + // nothing to decode. See: b/324468126 + if (phdr->p_memsz == 0) { + continue; + } + // note_fragment is scoped to within the loop so that there is // at most 1 PT_NOTE mapped at anytime during this search. MappedFileFragment note_fragment; if (!note_fragment.Map(fd_, file_offset_, phdr->p_offset, phdr->p_memsz)) { - DL_WARN("\"%s\" note mmap failed: %s", name_.c_str(), strerror(errno)); - // If mmap failed, skip the optimization but don't block ELF loading - return true; + DL_ERR("\"%s\": PT_NOTE mmap(nullptr, %zu, PROT_READ, MAP_PRIVATE, %d, %p) failed: %m", + name_.c_str(), phdr->p_memsz, fd_, page_start(file_offset_ + phdr->p_offset)); + return false; } const ElfW(Nhdr)* note_hdr = nullptr;