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 <[email protected]>
---
 libelf/ChangeLog    |  5 +++++
 libelf/gelf_xlate.c | 10 ++++++++--
 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  <[email protected]>
+
+       * 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  <[email protected]>
 
        * 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 <[email protected]>
    This file is part of elfutils.
    Written by Ulrich Drepper <[email protected]>, 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)
-- 
2.30.2

Reply via email to