diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2023-01-10 17:28:47 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-10 17:28:47 +0000 |
commit | 583fd5a3607aafeb043e6b0e2a4240193e2421ed (patch) | |
tree | cd4154298c13415624a65ff35147cd8a237ce3d8 | |
parent | c6f4069f6ffb56d843ef92d52d4368379b90de7c (diff) | |
parent | 3a6d77112780e6cf072ecd5abbbab61db8ab0266 (diff) | |
download | patchelf-583fd5a3607aafeb043e6b0e2a4240193e2421ed.tar.gz |
Merge #4470.17.1
447: Split segment size fix r=Mic92 a=otherjason
Co-authored-by: Jason <otherjason@nodomain.com>
-rw-r--r-- | src/patchelf.cc | 10 | ||||
-rw-r--r-- | src/patchelf.h | 2 |
2 files changed, 7 insertions, 5 deletions
diff --git a/src/patchelf.cc b/src/patchelf.cc index 0c8e260..2bb84eb 100644 --- a/src/patchelf.cc +++ b/src/patchelf.cc @@ -436,7 +436,7 @@ static uint64_t roundUp(uint64_t n, uint64_t m) template<ElfFileParams> -void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t startOffset) +void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t startOffset, size_t extraBytes) { assert(startOffset >= sizeof(Elf_Ehdr)); @@ -512,7 +512,7 @@ void ElfFile<ElfFileParamNames>::shiftFile(unsigned int extraPages, size_t start wri(phdr.p_offset, phdrs.at(splitIndex).p_offset - splitShift - shift); wri(phdr.p_paddr, phdrs.at(splitIndex).p_paddr - splitShift - shift); wri(phdr.p_vaddr, phdrs.at(splitIndex).p_vaddr - splitShift - shift); - wri(phdr.p_filesz, wri(phdr.p_memsz, splitShift + shift)); + wri(phdr.p_filesz, wri(phdr.p_memsz, splitShift + extraBytes)); wri(phdr.p_flags, PF_R | PF_W); wri(phdr.p_align, getPageSize()); } @@ -912,12 +912,14 @@ void ElfFile<ElfFileParamNames>::rewriteSectionsExecutable() neededSpace += sizeof(Elf_Phdr); debug("needed space is %d\n", neededSpace); - unsigned int neededPages = roundUp(neededSpace - startOffset, getPageSize()) / getPageSize(); + /* Calculate how many bytes are needed out of the additional pages. */ + size_t extraSpace = neededSpace - startOffset; + unsigned int neededPages = roundUp(extraSpace, getPageSize()) / getPageSize(); debug("needed pages is %d\n", neededPages); if (neededPages * getPageSize() > firstPage) error("virtual address space underrun!"); - shiftFile(neededPages, startOffset); + shiftFile(neededPages, startOffset, extraSpace); firstPage -= neededPages * getPageSize(); startOffset += neededPages * getPageSize(); diff --git a/src/patchelf.h b/src/patchelf.h index c336c51..f4eec6f 100644 --- a/src/patchelf.h +++ b/src/patchelf.h @@ -77,7 +77,7 @@ private: void sortShdrs(); - void shiftFile(unsigned int extraPages, size_t sizeOffset); + void shiftFile(unsigned int extraPages, size_t sizeOffset, size_t extraBytes); std::string getSectionName(const Elf_Shdr & shdr) const; |