This is the mail archive of the elfutils-devel@sourceware.org mailing list for the elfutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix GCC6 -Wnull-dereference warnings.


asm_begin.c: In function ‘asm_begin’:
asm_begin.c:62:7: error: potential null pointer dereference [-Werror=null-dereference]
       __fsetlocking (result->out.file, FSETLOCKING_BYCALLER);
       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

We set result to NULL just before this call in case of error.
Fixed by only calling __fsetlocking when result is not NULL.

strip.c: In function ‘handle_elf.constprop’:
strip.c:1270:31: error: null pointer dereference [-Werror=null-dereference]
       elf_assert ((versiondata->d_size / sizeof (Elf32_Word))
                    ~~~~~~~~~~~^~~

src/strip.c:597:37: note: in definition of macro ‘elf_assert’
 #define elf_assert(test) do { if (!(test)) goto illformed; } while (0)
                                     ^~~~

That is the wrong check, we want to check shndxdata, not versiondata here.

Signed-off-by: Mark Wielaard <mjw@redhat.com>
---
 libasm/ChangeLog   | 5 +++++
 libasm/asm_begin.c | 4 ++--
 src/ChangeLog      | 4 ++++
 src/strip.c        | 6 ++++--
 4 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/libasm/ChangeLog b/libasm/ChangeLog
index beb6211..a8ac2c7 100644
--- a/libasm/ChangeLog
+++ b/libasm/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-12  Mark Wielaard  <mjw@redhat.com>
+
+	* asm_begin.c (prepare_text_output): Only call __fsetlocking when
+	result isn't NULL.
+
 2015-10-05  Josh Stone  <jistone@redhat.com>
 
 	* Makefile.am (libasm.so): Add AM_V_CCLD and AM_V_at silencers.
diff --git a/libasm/asm_begin.c b/libasm/asm_begin.c
index ff4d94c..dc83cd8 100644
--- a/libasm/asm_begin.c
+++ b/libasm/asm_begin.c
@@ -58,8 +58,8 @@ prepare_text_output (AsmCtx_t *result)
 	  free (result);
 	  result = NULL;
 	}
-
-      __fsetlocking (result->out.file, FSETLOCKING_BYCALLER);
+      else
+	__fsetlocking (result->out.file, FSETLOCKING_BYCALLER);
     }
 
   return result;
diff --git a/src/ChangeLog b/src/ChangeLog
index 71709e4..369b12c 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2016-02-12  Mark Wielaard  <mjw@redhat.com>
+
+	* strip.c (handle_elf): Correct elf_assert shndxdata check.
+
 2016-02-09  Mark Wielaard  <mjw@redhat.com>
 
 	* readelf.c (read_encoded): Move up.
diff --git a/src/strip.c b/src/strip.c
index 06d7cfd..a604244 100644
--- a/src/strip.c
+++ b/src/strip.c
@@ -1267,8 +1267,10 @@ handle_elf (int fd, Elf *elf, const char *prefix, const char *fname,
 		    shndxdata = elf_getdata (shdr_info[shdr_info[cnt].symtab_idx].scn,
 					     NULL);
 
-		    elf_assert ((versiondata->d_size / sizeof (Elf32_Word))
-				>= shdr_info[cnt].data->d_size / elsize);
+		    elf_assert (shndxdata != NULL
+				&& shndxdata->d_buf != NULL
+				&& ((shndxdata->d_size / sizeof (Elf32_Word))
+				    >= shdr_info[cnt].data->d_size / elsize));
 		  }
 
 		if (shdr_info[cnt].version_idx != 0)
-- 
2.5.0

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]