summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2023-01-10 17:28:47 +0000
committerGitHub <noreply@github.com>2023-01-10 17:28:47 +0000
commit583fd5a3607aafeb043e6b0e2a4240193e2421ed (patch)
treecd4154298c13415624a65ff35147cd8a237ce3d8
parentc6f4069f6ffb56d843ef92d52d4368379b90de7c (diff)
parent3a6d77112780e6cf072ecd5abbbab61db8ab0266 (diff)
downloadpatchelf-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.cc10
-rw-r--r--src/patchelf.h2
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;