Fix memory access violations triggered by running strip on fuzzed binaries.
[deliverable/binutils-gdb.git] / bfd / coffcode.h
index 9e1c20acf38963e4f210ed5299242d5b70b84f3c..181f9af15b47f9d42fc45aaf86d3be5102372cd9 100644 (file)
@@ -2073,10 +2073,14 @@ coff_mkobject_hook (bfd * abfd,
 #endif
 
   if ((internal_f->f_flags & F_GO32STUB) != 0)
-    coff->go32stub = (char *) bfd_alloc (abfd, (bfd_size_type) GO32_STUBSIZE);
+    {
+      coff->go32stub = (char *) bfd_alloc (abfd, (bfd_size_type) GO32_STUBSIZE);
+      if (coff->go32stub == NULL)
+       return NULL;
+    }
   if (coff->go32stub != NULL)
     memcpy (coff->go32stub, internal_f->go32stub, GO32_STUBSIZE);
-
+  
   return coff;
 }
 #endif
@@ -2278,6 +2282,8 @@ coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
                bfd_size_type amt = bfd_coff_symesz (abfd);
 
                buf = bfd_malloc (amt);
+               if (buf == NULL)
+                 return FALSE;
                if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
                    || bfd_bread (buf, amt, abfd) != amt)
                  {
@@ -2666,10 +2672,16 @@ coff_write_relocs (bfd * abfd, int first_undef)
        amt = s->reloc_count;
        amt *= sizeof (arelent *);
        p = bfd_malloc (amt);
-       if (p == NULL && s->reloc_count > 0)
-         return FALSE;
-       memcpy (p, s->orelocation, (size_t) amt);
-       qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
+       if (p == NULL)
+         {
+           if (s->reloc_count > 0)
+             return FALSE;
+         }
+       else
+         {
+           memcpy (p, s->orelocation, (size_t) amt);
+           qsort (p, s->reloc_count, sizeof (arelent *), compare_arelent_ptr);
+         }
       }
 #endif
 
@@ -4526,6 +4538,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
   unsigned int nbr_func;
   LINENO *src;
   bfd_boolean have_func;
+  bfd_boolean ret = TRUE;
 
   BFD_ASSERT (asect->lineno == NULL);
 
@@ -4575,6 +4588,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
                (_("%B: warning: illegal symbol index 0x%lx in line number entry %d"),
                 abfd, (long) symndx, counter);
              cache_ptr->line_number = -1;
+             ret = FALSE;
              continue;
            }
 
@@ -4587,6 +4601,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
                (_("%B: warning: illegal symbol index 0x%lx in line number entry %d"),
                 abfd, (long) symndx, counter);
              cache_ptr->line_number = -1;
+             ret = FALSE;
              continue;
            }
          sym = (coff_symbol_type *) (ent->u.syment._n._n_n._n_zeroes);
@@ -4599,6 +4614,7 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
                (_("%B: warning: illegal symbol in line number entry %d"),
                 abfd, counter);
              cache_ptr->line_number = -1;
+             ret = FALSE;
              continue;
            }
 
@@ -4678,11 +4694,15 @@ coff_slurp_line_table (bfd *abfd, asection *asect)
 
              memcpy (lineno_cache, n_lineno_cache, amt);
            }
+         else
+           ret = FALSE;
          bfd_release (abfd, func_table);
        }
+      else
+       ret = FALSE;
     }
 
-  return TRUE;
+  return ret;
 }
 
 /* Slurp in the symbol table, converting it to generic form.  Note
@@ -4697,6 +4717,7 @@ coff_slurp_symbol_table (bfd * abfd)
   unsigned int *table_ptr;
   bfd_size_type amt;
   unsigned int number_of_symbols = 0;
+  bfd_boolean ret = TRUE;
 
   if (obj_symbols (abfd))
     return TRUE;
@@ -5017,6 +5038,7 @@ coff_slurp_symbol_table (bfd * abfd)
                (_("%B: Unrecognized storage class %d for %s symbol `%s'"),
                 abfd, src->u.syment.n_sclass,
                 dst->symbol.section->name, dst->symbol.name);
+             ret = FALSE;
            case C_EXTLAB:      /* External load time label.  */
            case C_HIDDEN:      /* Ext symbol in dmert public lib.  */
              dst->symbol.flags = BSF_DEBUGGING;
@@ -5052,7 +5074,7 @@ coff_slurp_symbol_table (bfd * abfd)
       }
   }
 
-  return TRUE;
+  return ret;
 }
 
 /* Classify a COFF symbol.  A couple of targets have globally visible
This page took 0.030104 seconds and 4 git commands to generate.