GCC10 -fanalyzer with -flto notices __elf64_getshdr_rdlock can fail
and because the result isn't checked in elf_strptr it can cause a
dereference of NULL.

Signed-off-by: Mark Wielaard <m...@klomp.org>
---
 libelf/ChangeLog    | 4 ++++
 libelf/elf_strptr.c | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/libelf/ChangeLog b/libelf/ChangeLog
index fcea8aa9..fd5518dc 100644
--- a/libelf/ChangeLog
+++ b/libelf/ChangeLog
@@ -1,3 +1,7 @@
+2020-05-08  Mark Wielaard  <m...@klomp.org>
+
+       * elf_strptr.c (elf_strptr): Check shdr is not NULL.
+
 2020-05-08  Mark Wielaard  <m...@klomp.org>
 
        * elf_getdata.c (__libelf_set_rawdata_wrlock): Check
diff --git a/libelf/elf_strptr.c b/libelf/elf_strptr.c
index e72a3a36..c7271707 100644
--- a/libelf/elf_strptr.c
+++ b/libelf/elf_strptr.c
@@ -145,7 +145,7 @@ elf_strptr (Elf *elf, size_t idx, size_t offset)
   else
     {
       Elf64_Shdr *shdr = strscn->shdr.e64 ?: __elf64_getshdr_rdlock (strscn);
-      if (unlikely (shdr->sh_type != SHT_STRTAB))
+      if (unlikely (shdr == NULL || shdr->sh_type != SHT_STRTAB))
        {
          /* This is no string section.  */
          __libelf_seterrno (ELF_E_INVALID_SECTION);
-- 
2.20.1

Reply via email to