[binutils-gdb] PR26452, ASAN: som_compute_checksum som.c:4293

Alan Modra amodra@sourceware.org
Tue Aug 25 13:38:21 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=2186273ac4ba9fa4c56dc8c5d47ab3a7e358cec9

commit 2186273ac4ba9fa4c56dc8c5d47ab3a7e358cec9
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Aug 25 15:46:02 2020 +0930

    PR26452, ASAN: som_compute_checksum som.c:4293
    
            PR 26452
            * som.c (som_compute_checksum): XOR 32-bit words in header,
            not unsigned long sized words.

Diff:
---
 bfd/ChangeLog |  6 ++++++
 bfd/som.c     | 11 ++++++-----
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 4fc95529ab3..38920f3a100 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,9 @@
+2020-08-25  Alan Modra  <amodra@gmail.com>
+
+	PR 26452
+	* som.c (som_compute_checksum): XOR 32-bit words in header,
+	not unsigned long sized words.
+
 2020-08-25  Alan Modra  <amodra@gmail.com>
 
 	PR 26430
diff --git a/bfd/som.c b/bfd/som.c
index 887d9b187ef..4f0a606c18a 100644
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -37,7 +37,7 @@ static bfd_boolean som_mkobject (bfd *);
 static bfd_boolean som_is_space (asection *);
 static bfd_boolean som_is_subspace (asection *);
 static int compare_subspaces (const void *, const void *);
-static unsigned long som_compute_checksum (struct som_external_header *);
+static uint32_t som_compute_checksum (struct som_external_header *);
 static bfd_boolean som_build_and_write_symbol_table (bfd *);
 static unsigned int som_slurp_symbol_table (bfd *);
 
@@ -4281,14 +4281,15 @@ som_finish_writing (bfd *abfd)
 
 /* Compute and return the checksum for a SOM file header.  */
 
-static unsigned long
+static uint32_t
 som_compute_checksum (struct som_external_header *hdr)
 {
-  unsigned long checksum, count, i;
-  unsigned long *buffer = (unsigned long *) hdr;
+  size_t count, i;
+  uint32_t checksum;
+  uint32_t *buffer = (uint32_t *) hdr;
 
   checksum = 0;
-  count = sizeof (struct som_external_header) / 4;
+  count = sizeof (*hdr) / sizeof (*buffer);
   for (i = 0; i < count; i++)
     checksum ^= *(buffer + i);


More information about the Binutils-cvs mailing list