From: Mark Wielaard Date: Fri, 24 Mar 2017 13:10:26 +0000 (+0100) Subject: Use the empty string for note names with zero size (without any data). X-Git-Tag: elfutils-0.169~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0b58c5e0b34e54194aa042f2310af58ee7de603;p=thirdparty%2Felfutils.git 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 --- diff --git a/libdwfl/ChangeLog b/libdwfl/ChangeLog index 4c9f4f6ac..ede6d4710 100644 --- a/libdwfl/ChangeLog +++ b/libdwfl/ChangeLog @@ -1,3 +1,9 @@ +2017-03-24 Mark Wielaard + + * 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 * linux-kernel-modules.c: Include system.h. diff --git a/libdwfl/linux-core-attach.c b/libdwfl/linux-core-attach.c index 93d0e46eb..f82ed0321 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 9dd76c00a..41381aa03 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2017-03-24 Mark Wielaard + + * 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 * readelf.c (handle_gnu_hash): Check inner < max_nsyms before diff --git a/src/elfcmp.c b/src/elfcmp.c index 7673cf212..50464207b 100644 --- a/src/elfcmp.c +++ b/src/elfcmp.c @@ -419,7 +419,8 @@ main (int argc, char *argv[]) && (off1 = gelf_getnote (data1, off1, ¬e1, &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 490b6d592..97a43b066 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];