This is the mail archive of the mailing list for the elfutils project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] libelf: Only memcpy ehdr back when not already directly mmapped.

When the elf file is mmapped ehdr can still point to ehdr_mem if the
address is unaligned.  In such cases we do need to memcpy the ehdr back
to the file. We shouldn't when ehdr already comes directly from the mmapped
file, because that would cause an memcpy call with overlapping addresses
(ehdr being copied directly over itself).

Signed-off-by: Mark Wielaard <>
 libelf/ChangeLog          |    5 +++++
 libelf/elf32_updatefile.c |    2 +-
 2 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index a996ccf..148c945 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-08  Mark Wielaard  <>
+	* elf32_updatefile.c (elfXX_updatemmap): Only memcpy ehdr when not
+	already directly mmapped.
 2013-11-05  Mark Wielaard  <>
 	* elf32_updatefile.c (elfXX_updatefile): Copy all section headers
diff --git a/libelf/elf32_updatefile.c b/libelf/elf32_updatefile.c
index c4af9c0..b39e284 100644
--- a/libelf/elf32_updatefile.c
+++ b/libelf/elf32_updatefile.c
@@ -133,7 +133,7 @@ __elfw2(LIBELFBITS,updatemmap) (Elf *elf, int change_bo, size_t shnum)
 	  (*fctp) ((char *) elf->map_address + elf->start_offset, ehdr,
 		   sizeof (ElfW2(LIBELFBITS,Ehdr)), 1);
-      else
+      else if (elf->map_address + elf->start_offset != ehdr)
 	memcpy (elf->map_address + elf->start_offset, ehdr,
 		sizeof (ElfW2(LIBELFBITS,Ehdr)));

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]