From de3e1f5e11f533d8678474eb9234ba35efa960d6 Mon Sep 17 00:00:00 2001 From: Breno Rodrigues Guimaraes Date: Mon, 20 Feb 2023 18:22:17 -0300 Subject: [PATCH] Add one extra page to avoid overlapping with next page if its rounded down --- src/patchelf.cc | 4 +++- tests/Makefile.am | 4 +++- tests/overlapping-segments-after-rounding | Bin 0 -> 227896 bytes tests/overlapping-segments-after-rounding.sh | 23 +++++++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100755 tests/overlapping-segments-after-rounding create mode 100755 tests/overlapping-segments-after-rounding.sh diff --git a/src/patchelf.cc b/src/patchelf.cc index ca247c12..b78210c4 100644 --- a/src/patchelf.cc +++ b/src/patchelf.cc @@ -985,7 +985,9 @@ void ElfFile::rewriteSectionsExecutable() /* Calculate how many bytes are needed out of the additional pages. */ size_t extraSpace = neededSpace - startOffset; - unsigned int neededPages = roundUp(extraSpace, getPageSize()) / getPageSize(); + // Always give one extra page to avoid colliding with segments that start at + // unaligned addresses and will be rounded down when loaded + unsigned int neededPages = 1 + roundUp(extraSpace, getPageSize()) / getPageSize(); debug("needed pages is %d\n", neededPages); if (neededPages * getPageSize() > firstPage) error("virtual address space underrun!"); diff --git a/tests/Makefile.am b/tests/Makefile.am index 4a08c145..b3f0b97c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -47,6 +47,7 @@ src_TESTS = \ print-execstack.sh \ modify-execstack.sh \ rename-dynamic-symbols.sh \ + overlapping-segments-after-rounding.sh \ empty-note.sh build_TESTS = \ @@ -54,7 +55,8 @@ build_TESTS = \ TESTS = $(src_TESTS) $(build_TESTS) -EXTRA_DIST = no-rpath-prebuild $(src_TESTS) no-rpath-prebuild.sh invalid-elf endianness empty-note +EXTRA_DIST = no-rpath-prebuild $(src_TESTS) no-rpath-prebuild.sh invalid-elf endianness empty-note \ + overlapping-segments-after-rounding TESTS_ENVIRONMENT = PATCHELF_DEBUG=1 STRIP=$(STRIP) OBJDUMP=$(OBJDUMP) READELF=$(READELF) OBJCOPY=$(OBJCOPY) diff --git a/tests/overlapping-segments-after-rounding b/tests/overlapping-segments-after-rounding new file mode 100755 index 0000000000000000000000000000000000000000..ecad537dbb2c83eba1571f23eea6efede471272b GIT binary patch literal 227896 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 a-))Bvzx-3^rdLI4{(R2S6