[PATCH] libdwfl: Make sure note data is properly aligned.
Mark Wielaard
mark@klomp.org
Sat Dec 18 01:04:06 GMT 2021
In dwfl_segment_report_module the note data might not be properly
aligned. Check that it is before accessing the data directly.
Otherwise convert data so it is properly aligned.
Also fix NOTE_ALIGN4 and NOTE_ALIGN8 to work correctly with long
types.
Signed-off-by: Mark Wielaard <mark@klomp.org>
---
libdwfl/ChangeLog | 5 +++++
libdwfl/dwfl_segment_report_module.c | 5 ++++-
libelf/ChangeLog | 5 +++++
libelf/libelfP.h | 4 ++--
4 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 8760b1ef..f18a0c45 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,8 @@
+2021-12-16 Mark Wielaard <mark@klomp.org>
+
+ * dwfl_segment_report_module.c (dwfl_segment_report_module): Check
+ note data is properly aligned.
+
2021-12-16 Mark Wielaard <mark@klomp.org>
* link_map.c (dwfl_link_map_report): Make sure phnum is non-zero.
diff --git a/libdwfl/dwfl_segment_report_module.c b/libdwfl/dwfl_segment_report_module.c
index f323929e..2263e3cc 100644
--- a/libdwfl/dwfl_segment_report_module.c
+++ b/libdwfl/dwfl_segment_report_module.c
@@ -517,7 +517,10 @@ dwfl_segment_report_module (Dwfl *dwfl, int ndx, const char *name,
assert (sizeof (Elf32_Nhdr) == sizeof (Elf64_Nhdr));
void *notes;
- if (ei_data == MY_ELFDATA)
+ if (ei_data == MY_ELFDATA
+ && (uintptr_t) data == (align == 8
+ ? NOTE_ALIGN8 ((uintptr_t) data)
+ : NOTE_ALIGN4 ((uintptr_t) data)))
notes = data;
else
{
diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index 96059eff..617d97a5 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,8 @@
+2021-12-16 Mark Wielaard <mark@klomp.org>
+
+ * libelfP.h (NOTE_ALIGN4): And with negative unsigned long.
+ (NOTE_ALIGN8): Likewise.
+
2021-12-15 Mark Wielaard <mark@klomp.org>
* elf_begin.c (get_shnum): Use offsetof to get field of unaligned
diff --git a/libelf/libelfP.h b/libelf/libelfP.h
index fc1aebec..2c6995bb 100644
--- a/libelf/libelfP.h
+++ b/libelf/libelfP.h
@@ -603,10 +603,10 @@ extern void __libelf_reset_rawdata (Elf_Scn *scn, void *buf, size_t size,
/* Align offset to 4 bytes as needed for note name and descriptor data.
This is almost always used, except for GNU Property notes, which use
8 byte padding... */
-#define NOTE_ALIGN4(n) (((n) + 3) & -4U)
+#define NOTE_ALIGN4(n) (((n) + 3) & -4UL)
/* Special note padding rule for GNU Property notes. */
-#define NOTE_ALIGN8(n) (((n) + 7) & -8U)
+#define NOTE_ALIGN8(n) (((n) + 7) & -8UL)
/* Convenience macro. */
#define INVALID_NDX(ndx, type, data) \
--
2.30.2
More information about the Elfutils-devel
mailing list