PR24955, libbfd terminating program on out of memory (part2)
authorAlan Modra <amodra@gmail.com>
Mon, 14 Oct 2019 03:04:30 +0000 (13:34 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 14 Oct 2019 06:17:12 +0000 (16:47 +1030)
PR 24955
* elflink.c (elf_output_implib): Don't use xmalloc.  Don't ignore
return value of bfd_alloc2.
* peXXigen.c (_bfd_XXi_write_codeview_record): Don't use xmalloc.
* pef.c (bfd_pef_print_symbol): Likewise.  Don't ignore return
value of bfd_get_section_contents.
* som.c (som_write_space_strings): Don't use xmalloc.
(som_write_symbol_strings): Likewise.

bfd/ChangeLog
bfd/elflink.c
bfd/peXXigen.c
bfd/pef.c
bfd/som.c

index 56f38cfb039e02de4e145f3ffaa36d2b64cccd37..a864b8beb34bc1ad0151d3f65c51b4d52c9e998b 100644 (file)
@@ -1,3 +1,14 @@
+2019-10-14  Alan Modra  <amodra@gmail.com>
+
+       PR 24955
+       * elflink.c (elf_output_implib): Don't use xmalloc.  Don't ignore
+       return value of bfd_alloc2.
+       * peXXigen.c (_bfd_XXi_write_codeview_record): Don't use xmalloc.
+       * pef.c (bfd_pef_print_symbol): Likewise.  Don't ignore return
+       value of bfd_get_section_contents.
+       * som.c (som_write_space_strings): Don't use xmalloc.
+       (som_write_symbol_strings): Likewise.
+
 2019-10-11  Max Filippov  <jcmvbkbc@gmail.com>
 
        * dwarf2.c (stash_maybe_enable_info_hash_tables): Only set
index 395d96d6cfb5ed6ccdcef1522a72b3d55e6cb885..d0f70cb6f58007aee7d5755888f546df82a21838 100644 (file)
@@ -11649,7 +11649,10 @@ elf_output_implib (bfd *abfd, struct bfd_link_info *info)
     return FALSE;
 
   /* Read in the symbol table.  */
-  sympp = (asymbol **) xmalloc (symsize);
+  sympp = (asymbol **) bfd_malloc (symsize);
+  if (sympp == NULL)
+    return FALSE;
+
   symcount = bfd_canonicalize_symtab (abfd, sympp);
   if (symcount < 0)
     goto free_sym_buf;
@@ -11677,6 +11680,9 @@ elf_output_implib (bfd *abfd, struct bfd_link_info *info)
   /* Make symbols absolute.  */
   osymbuf = (elf_symbol_type *) bfd_alloc2 (implib_bfd, symcount,
                                            sizeof (*osymbuf));
+  if (osymbuf == NULL)
+    goto free_sym_buf;
+
   for (src_count = 0; src_count < symcount; src_count++)
     {
       memcpy (&osymbuf[src_count], (elf_symbol_type *) sympp[src_count],
index ee6da6480d83f8928a8b5e42581073667df46e5d..ab0da7f53284be96a260fe608f4fda46bed168a2 100644 (file)
@@ -1216,7 +1216,10 @@ _bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinf
   if (bfd_seek (abfd, where, SEEK_SET) != 0)
     return 0;
 
-  buffer = xmalloc (size);
+  buffer = bfd_malloc (size);
+  if (buffer == NULL)
+    return 0;
+
   cvinfo70 = (CV_INFO_PDB70 *) buffer;
   H_PUT_32 (abfd, CVINFO_PDB70_CVSIGNATURE, cvinfo70->CvSignature);
 
index effa076405310933f21bea67786b2e3e9eec9784..fccb9b6ac38aba7fa2c820e280887c20945d35b0 100644 (file)
--- a/bfd/pef.c
+++ b/bfd/pef.c
@@ -221,15 +221,16 @@ bfd_pef_print_symbol (bfd *abfd,
       fprintf (file, " %-5s %s", symbol->section->name, symbol->name);
       if (CONST_STRNEQ (symbol->name, "__traceback_"))
        {
-         unsigned char *buf = xmalloc (symbol->udata.i);
+         unsigned char *buf;
          size_t offset = symbol->value + 4;
          size_t len = symbol->udata.i;
-         int ret;
 
-         bfd_get_section_contents (abfd, symbol->section, buf, offset, len);
-         ret = bfd_pef_parse_traceback_table (abfd, symbol->section, buf,
-                                              len, 0, NULL, file);
-         if (ret < 0)
+         buf = bfd_malloc (len);
+         if (buf == NULL
+             || !bfd_get_section_contents (abfd, symbol->section, buf,
+                                           offset, len)
+             || bfd_pef_parse_traceback_table (abfd, symbol->section, buf,
+                                               len, 0, NULL, file) < 0)
            fprintf (file, " [ERROR]");
          free (buf);
        }
index 4c9dcaee67673b2e951a208e7fb41b94db8295da..5145651c3d677fa4d4d94feedadbd5f1abc6989b 100644 (file)
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -3309,13 +3309,16 @@ som_write_space_strings (bfd *abfd,
   /* Chunk of memory that we can use as buffer space, then throw
      away.  */
   size_t tmp_space_size = SOM_TMP_BUFSIZE;
-  char *tmp_space = xmalloc (tmp_space_size);
+  char *tmp_space = bfd_malloc (tmp_space_size);
   char *p = tmp_space;
   unsigned int strings_size = 0;
   asection *section;
   bfd_size_type amt;
   bfd_size_type res;
 
+  if (tmp_space == NULL)
+    return FALSE;
+
   /* Seek to the start of the space strings in preparation for writing
      them out.  */
   if (bfd_seek (abfd, (file_ptr) current_offset, SEEK_SET) != 0)
@@ -3419,12 +3422,15 @@ som_write_symbol_strings (bfd *abfd,
   /* Chunk of memory that we can use as buffer space, then throw
      away.  */
   size_t tmp_space_size = SOM_TMP_BUFSIZE;
-  char *tmp_space = xmalloc (tmp_space_size);
+  char *tmp_space = bfd_malloc (tmp_space_size);
   char *p = tmp_space;
   unsigned int strings_size = 0;
   bfd_size_type amt;
   bfd_size_type res;
 
+  if (tmp_space == NULL)
+    return FALSE;
+
   /* This gets a bit gruesome because of the compilation unit.  The
      strings within the compilation unit are part of the symbol
      strings, but don't have symbol_dictionary entries.  So, manually