Blame SOURCES/binutils-CVE-2019-9075.patch

a6dfc0
diff -rup binutils.orig/bfd/archive64.c binutils-2.31.1/bfd/archive64.c
a6dfc0
--- binutils.orig/bfd/archive64.c	2019-02-26 11:17:11.882530151 +0000
a6dfc0
+++ binutils-2.31.1/bfd/archive64.c	2019-02-26 11:19:18.422488805 +0000
a6dfc0
@@ -100,8 +100,6 @@ _bfd_archive_64_bit_slurp_armap (bfd *ab
a6dfc0
     return FALSE;
a6dfc0
   carsyms = ardata->symdefs;
a6dfc0
   stringbase = ((char *) ardata->symdefs) + carsym_size;
a6dfc0
-  stringbase[stringsize] = 0;
a6dfc0
-  stringend = stringbase + stringsize;
a6dfc0
 
a6dfc0
   raw_armap = (bfd_byte *) bfd_alloc (abfd, ptrsize);
a6dfc0
   if (raw_armap == NULL)
a6dfc0
@@ -115,15 +113,17 @@ _bfd_archive_64_bit_slurp_armap (bfd *ab
a6dfc0
       goto release_raw_armap;
a6dfc0
     }
a6dfc0
 
a6dfc0
+  stringend = stringbase + stringsize;
a6dfc0
+  *stringend = 0;
a6dfc0
   for (i = 0; i < nsymz; i++)
a6dfc0
     {
a6dfc0
       carsyms->file_offset = bfd_getb64 (raw_armap + i * 8);
a6dfc0
       carsyms->name = stringbase;
a6dfc0
-      if (stringbase < stringend)
a6dfc0
-	stringbase += strlen (stringbase) + 1;
a6dfc0
+      stringbase += strlen (stringbase);
a6dfc0
+      if (stringbase != stringend)
a6dfc0
+	++stringbase;
a6dfc0
       ++carsyms;
a6dfc0
     }
a6dfc0
-  *stringbase = '\0';
a6dfc0
 
a6dfc0
   ardata->symdef_count = nsymz;
a6dfc0
   ardata->first_file_filepos = bfd_tell (abfd);
a6dfc0
diff -rup binutils.orig/bfd/archive.c binutils-2.31.1/bfd/archive.c
a6dfc0
--- binutils.orig/bfd/archive.c	2019-02-26 11:17:11.884530134 +0000
a6dfc0
+++ binutils-2.31.1/bfd/archive.c	2019-02-26 11:18:33.354859687 +0000
a6dfc0
@@ -1014,6 +1014,7 @@ do_slurp_coff_armap (bfd *abfd)
a6dfc0
   int *raw_armap, *rawptr;
a6dfc0
   struct artdata *ardata = bfd_ardata (abfd);
a6dfc0
   char *stringbase;
a6dfc0
+  char *stringend;
a6dfc0
   bfd_size_type stringsize;
a6dfc0
   bfd_size_type parsed_size;
a6dfc0
   carsym *carsyms;
a6dfc0
@@ -1073,22 +1074,20 @@ do_slurp_coff_armap (bfd *abfd)
a6dfc0
     }
a6dfc0
 
a6dfc0
   /* OK, build the carsyms.  */
a6dfc0
-  for (i = 0; i < nsymz && stringsize > 0; i++)
a6dfc0
+  stringend = stringbase + stringsize;
a6dfc0
+  *stringend = 0;
a6dfc0
+  for (i = 0; i < nsymz; i++)
a6dfc0
     {
a6dfc0
       bfd_size_type len;
a6dfc0
 
a6dfc0
       rawptr = raw_armap + i;
a6dfc0
       carsyms->file_offset = swap ((bfd_byte *) rawptr);
a6dfc0
       carsyms->name = stringbase;
a6dfc0
-      /* PR 17512: file: 4a1d50c1.  */
a6dfc0
-      len = strnlen (stringbase, stringsize);
a6dfc0
-      if (len < stringsize)
a6dfc0
-	len ++;
a6dfc0
-      stringbase += len;
a6dfc0
-      stringsize -= len;
a6dfc0
+      stringbase += strlen (stringbase);
a6dfc0
+      if (stringbase != stringend)
a6dfc0
+	++stringbase;
a6dfc0
       carsyms++;
a6dfc0
     }
a6dfc0
-  *stringbase = 0;
a6dfc0
 
a6dfc0
   ardata->symdef_count = nsymz;
a6dfc0
   ardata->first_file_filepos = bfd_tell (abfd);