summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <mark@klomp.org>2022-03-30 00:17:08 +0200
committerMark Wielaard <mark@klomp.org>2022-03-30 16:46:02 +0200
commite3e2ae06fbfcd1b2f3de6945689ef9d9c94a2123 (patch)
tree4e4ff931649d7b1ded589f5190e1b2d3326328a6
parentdec6d82cf2e9c79b9b45a29de5ea2d8f25cc633b (diff)
libelf: Also copy/convert partial datastructures in xlate functions
The generated xlate functions can only convert full datastructures, dropping any trailing partial data on the floor. That means some of the data might be undefined. Just copy over the trailing bytes as is. That data isn't really usable. But at least it is defined data. https://sourceware.org/bugzilla/show_bug.cgi?id=29000 Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r--libelf/ChangeLog5
-rw-r--r--libelf/gelf_xlate.c10
2 files changed, 13 insertions, 2 deletions
diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index 7fd6202b..299179cb 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,8 @@
+2022-03-29 Mark Wielaard <mark@klomp.org>
+
+ * gelf_xlate.c (START): Define and use sz variable.
+ (END): Use sz variable to decide whether to do a memmove.
+
2022-03-24 Mark Wielaard <mark@klomp.org>
* elf.h: Update from glibc.
diff --git a/libelf/gelf_xlate.c b/libelf/gelf_xlate.c
index b9e7fd65..6f8c57b7 100644
--- a/libelf/gelf_xlate.c
+++ b/libelf/gelf_xlate.c
@@ -1,5 +1,6 @@
/* Transformation functions for ELF data types.
Copyright (C) 1998,1999,2000,2002,2004,2005,2006,2007,2015 Red Hat, Inc.
+ Copyright (C) 2022 Mark J. Wielaard <mark@klomp.org>
This file is part of elfutils.
Written by Ulrich Drepper <drepper@redhat.com>, 1998.
@@ -138,9 +139,14 @@ union unaligned
int encode __attribute__ ((unused))) \
{ ElfW2(Bits, Name) *tdest = (ElfW2(Bits, Name) *) dest; \
ElfW2(Bits, Name) *tsrc = (ElfW2(Bits, Name) *) src; \
+ size_t sz = sizeof (ElfW2(Bits, Name)); \
size_t n; \
- for (n = len / sizeof (ElfW2(Bits, Name)); n > 0; ++tdest, ++tsrc, --n) {
-#define END(Bits, Name) } }
+ for (n = len / sz; n > 0; ++tdest, ++tsrc, --n) {
+#define END(Bits, Name) \
+ } \
+ if (len % sz > 0) /* Cannot convert partial structures, just copy. */ \
+ memmove (dest, src, len % sz); \
+ }
#define TYPE_EXTRA(Code)
#define TYPE_XLATE(Code) Code
#define TYPE_NAME(Type, Name) TYPE_NAME2 (Type, Name)