summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2017-03-24 14:10:26 +0100
committerMark Wielaard <[email protected]>2017-04-03 23:47:59 +0200
commitb0b58c5e0b34e54194aa042f2310af58ee7de603 (patch)
tree833f7fb0c98218a3af8450f8d5171e320b4f20d3
parent9d84fdd78705d7a1b9947a9f4ca77fbccdd76d4a (diff)
Use the empty string for note names with zero size (without any data).
ELF notes can have a zero sized name. In which case there is no data at all (so also no zero terminator). Make sure to use the empty string for such notes if the code does not otherwise explicitly check n_namesz. https://sourceware.org/bugzilla/show_bug.cgi?id=21300 Signed-off-by: Mark Wielaard <[email protected]>
-rw-r--r--libdwfl/ChangeLog6
-rw-r--r--libdwfl/linux-core-attach.c9
-rw-r--r--src/ChangeLog6
-rw-r--r--src/elfcmp.c6
-rw-r--r--src/readelf.c2
5 files changed, 23 insertions, 6 deletions
diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog
index 4c9f4f6a..ede6d471 100644
--- a/libdwfl/ChangeLog
+++ b/libdwfl/ChangeLog
@@ -1,3 +1,9 @@
+2017-03-24 Mark Wielaard <[email protected]>
+
+ * linux-core-attach.c (core_next_thread): If n_namesz == 0 then
+ the note name data is the empty string.
+ (dwfl_core_file_attach): Likewise.
+
2017-02-15 Ulf Hermann <[email protected]>
* linux-kernel-modules.c: Include system.h.
diff --git a/libdwfl/linux-core-attach.c b/libdwfl/linux-core-attach.c
index 93d0e46e..f82ed032 100644
--- a/libdwfl/linux-core-attach.c
+++ b/libdwfl/linux-core-attach.c
@@ -125,7 +125,8 @@ core_next_thread (Dwfl *dwfl __attribute__ ((unused)), void *dwfl_arg,
&desc_offset)) > 0)
{
/* Do not check NAME for now, help broken Linux kernels. */
- const char *name = note_data->d_buf + name_offset;
+ const char *name = (nhdr.n_namesz == 0
+ ? "" : note_data->d_buf + name_offset);
const char *desc = note_data->d_buf + desc_offset;
GElf_Word regs_offset;
size_t nregloc;
@@ -178,7 +179,8 @@ core_set_initial_registers (Dwfl_Thread *thread, void *thread_arg_voidp)
/* __libdwfl_attach_state_for_core already verified the note is there. */
assert (getnote_err != 0);
/* Do not check NAME for now, help broken Linux kernels. */
- const char *name = note_data->d_buf + name_offset;
+ const char *name = (nhdr.n_namesz == 0
+ ? "" : note_data->d_buf + name_offset);
const char *desc = note_data->d_buf + desc_offset;
GElf_Word regs_offset;
size_t nregloc;
@@ -367,7 +369,8 @@ dwfl_core_file_attach (Dwfl *dwfl, Elf *core)
&nhdr, &name_offset, &desc_offset)) > 0)
{
/* Do not check NAME for now, help broken Linux kernels. */
- const char *name = note_data->d_buf + name_offset;
+ const char *name = (nhdr.n_namesz == 0
+ ? "" : note_data->d_buf + name_offset);
const char *desc = note_data->d_buf + desc_offset;
GElf_Word regs_offset;
size_t nregloc;
diff --git a/src/ChangeLog b/src/ChangeLog
index 9dd76c00..41381aa0 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,11 @@
2017-03-24 Mark Wielaard <[email protected]>
+ * elfcmp.c (main): If n_namesz == 0 then the note name data is the
+ empty string.
+ * readelf.c (handle_notes_data): Likewise.
+
+2017-03-24 Mark Wielaard <[email protected]>
+
* readelf.c (handle_gnu_hash): Check inner < max_nsyms before
indexing into chain array.
diff --git a/src/elfcmp.c b/src/elfcmp.c
index 7673cf21..50464207 100644
--- a/src/elfcmp.c
+++ b/src/elfcmp.c
@@ -419,7 +419,8 @@ main (int argc, char *argv[])
&& (off1 = gelf_getnote (data1, off1, &note1,
&name_offset, &desc_offset)) > 0)
{
- const char *name1 = data1->d_buf + name_offset;
+ const char *name1 = (note1.n_namesz == 0
+ ? "" : data1->d_buf + name_offset);
const void *desc1 = data1->d_buf + desc_offset;
if (off2 >= data2->d_size)
{
@@ -435,7 +436,8 @@ main (int argc, char *argv[])
error (2, 0, gettext ("\
cannot read note section [%zu] '%s' in '%s': %s"),
elf_ndxscn (scn2), sname2, fname2, elf_errmsg (-1));
- const char *name2 = data2->d_buf + name_offset;
+ const char *name2 = (note2.n_namesz == 0
+ ? "" : data2->d_buf + name_offset);
const void *desc2 = data2->d_buf + desc_offset;
if (note1.n_namesz != note2.n_namesz
diff --git a/src/readelf.c b/src/readelf.c
index 490b6d59..97a43b06 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -9365,7 +9365,7 @@ handle_notes_data (Ebl *ebl, const GElf_Ehdr *ehdr,
&& (offset = gelf_getnote (data, offset,
&nhdr, &name_offset, &desc_offset)) > 0)
{
- const char *name = data->d_buf + name_offset;
+ const char *name = nhdr.n_namesz == 0 ? "" : data->d_buf + name_offset;
const char *desc = data->d_buf + desc_offset;
char buf[100];