bfd_cleanup for object_p
[deliverable/binutils-gdb.git] / bfd / vms-alpha.c
index 24842780b6d1c09da332d0b20ffbd4c43ebda294..241dab340d7c723f902c3337e79c6f68ca3b39bc 100644 (file)
@@ -863,7 +863,7 @@ vms_get_remaining_object_record (bfd *abfd, unsigned int read_so_far)
   if (to_read > PRIV (recrd.buf_size))
     {
       PRIV (recrd.buf)
-       = (unsigned char *) bfd_realloc (PRIV (recrd.buf), to_read);
+       = (unsigned char *) bfd_realloc_or_free (PRIV (recrd.buf), to_read);
       if (PRIV (recrd.buf) == NULL)
        return 0;
       PRIV (recrd.buf_size) = to_read;
@@ -1126,7 +1126,7 @@ add_symbol_entry (bfd *abfd, struct vms_symbol_entry *sym)
       else
        {
          PRIV (max_sym_count) *= 2;
-         PRIV (syms) = bfd_realloc
+         PRIV (syms) = bfd_realloc_or_free
            (PRIV (syms),
             (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *)));
        }
@@ -1548,7 +1548,7 @@ image_inc_ptr (bfd *abfd, bfd_vma offset)
 
 /* Save current DST location counter under specified index.  */
 
-static void
+static bfd_boolean
 dst_define_location (bfd *abfd, unsigned int loc)
 {
   vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc));
@@ -1556,12 +1556,16 @@ dst_define_location (bfd *abfd, unsigned int loc)
   /* Grow the ptr offset table if necessary.  */
   if (loc + 1 > PRIV (dst_ptr_offsets_count))
     {
-      PRIV (dst_ptr_offsets) = bfd_realloc (PRIV (dst_ptr_offsets),
-                                          (loc + 1) * sizeof (unsigned int));
+      PRIV (dst_ptr_offsets)
+       = bfd_realloc_or_free (PRIV (dst_ptr_offsets),
+                              (loc + 1) * sizeof (unsigned int));
+      if (PRIV (dst_ptr_offsets) == NULL)
+       return FALSE;
       PRIV (dst_ptr_offsets_count) = loc + 1;
     }
 
   PRIV (dst_ptr_offsets)[loc] = PRIV (image_offset);
+  return TRUE;
 }
 
 /* Restore saved DST location counter from specified index.  */
@@ -2311,7 +2315,8 @@ _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info)
            return FALSE;
          if (rel1 != RELC_NONE)
            goto bad_context;
-         dst_define_location (abfd, op1);
+         if (!dst_define_location (abfd, op1))
+           return FALSE;
          break;
 
          /* Set location: pop index, restore location counter from index
@@ -2702,7 +2707,7 @@ alpha_vms_free_private (bfd *abfd)
 /* Check the format for a file being read.
    Return a (bfd_target *) if it's an object file or zero if not.  */
 
-static const struct bfd_target *
+static bfd_cleanup
 alpha_vms_object_p (bfd *abfd)
 {
   void *tdata_save = abfd->tdata.any;
@@ -2719,7 +2724,7 @@ alpha_vms_object_p (bfd *abfd)
     }
 
   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
-    goto err_wrong_format;
+    goto error_ret;
 
   /* The first challenge with VMS is to discover the kind of the file.
 
@@ -2738,27 +2743,17 @@ alpha_vms_object_p (bfd *abfd)
      2 bytes size repeated) and 12 bytes for images (4 bytes major id,
      4 bytes minor id, 4 bytes length).  */
   test_len = 12;
-
-  /* Size the main buffer.  */
-  buf = (unsigned char *) bfd_malloc (test_len);
+  buf = _bfd_malloc_and_read (abfd, test_len, test_len);
   if (buf == NULL)
     goto error_ret;
   PRIV (recrd.buf) = buf;
   PRIV (recrd.buf_size) = test_len;
-
-  /* Initialize the record pointer.  */
   PRIV (recrd.rec) = buf;
 
-  if (bfd_bread (buf, test_len, abfd) != test_len)
-    goto err_wrong_format;
-
   /* Is it an image?  */
   if ((bfd_getl32 (buf) == EIHD__K_MAJORID)
       && (bfd_getl32 (buf + 4) == EIHD__K_MINORID))
     {
-      unsigned int to_read;
-      unsigned int read_so_far;
-      unsigned int remaining;
       unsigned int eisd_offset, eihs_offset;
 
       /* Extract the header size.  */
@@ -2768,44 +2763,25 @@ alpha_vms_object_p (bfd *abfd)
       if (PRIV (recrd.rec_size) == 0)
        PRIV (recrd.rec_size) = sizeof (struct vms_eihd);
 
-      if (PRIV (recrd.rec_size) > PRIV (recrd.buf_size))
-       {
-         buf = bfd_realloc_or_free (buf, PRIV (recrd.rec_size));
-
-         if (buf == NULL)
-           {
-             PRIV (recrd.buf) = NULL;
-             goto error_ret;
-           }
-         PRIV (recrd.buf) = buf;
-         PRIV (recrd.buf_size) = PRIV (recrd.rec_size);
-       }
-
       /* PR 21813: Check for a truncated record.  */
-      if (PRIV (recrd.rec_size < test_len))
-       goto error_ret;
-      /* Read the remaining record.  */
-      remaining = PRIV (recrd.rec_size) - test_len;
-      to_read = MIN (VMS_BLOCK_SIZE - test_len, remaining);
-      read_so_far = test_len;
-
-      while (remaining > 0)
-       {
-         if (bfd_bread (buf + read_so_far, to_read, abfd) != to_read)
-           goto err_wrong_format;
+      /* PR 17512: file: 7d7c57c2.  */
+      if (PRIV (recrd.rec_size) < sizeof (struct vms_eihd))
+       goto err_wrong_format;
 
-         read_so_far += to_read;
-         remaining -= to_read;
+      if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
+       goto error_ret;
 
-         to_read = MIN (VMS_BLOCK_SIZE, remaining);
-       }
+      free (PRIV (recrd.buf));
+      PRIV (recrd.buf) = NULL;
+      buf = _bfd_malloc_and_read (abfd, PRIV (recrd.rec_size),
+                                 PRIV (recrd.rec_size));
+      if (buf == NULL)
+       goto error_ret;
 
-      /* Reset the record pointer.  */
+      PRIV (recrd.buf) = buf;
+      PRIV (recrd.buf_size) = PRIV (recrd.rec_size);
       PRIV (recrd.rec) = buf;
 
-      /* PR 17512: file: 7d7c57c2.  */
-      if (PRIV (recrd.rec_size) < sizeof (struct vms_eihd))
-       goto error_ret;
       vms_debug2 ((2, "file type is image\n"));
 
       if (!_bfd_vms_slurp_eihd (abfd, &eisd_offset, &eihs_offset))
@@ -2850,7 +2826,7 @@ alpha_vms_object_p (bfd *abfd)
   if (! bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0))
     goto err_wrong_format;
 
-  return abfd->xvec;
+  return alpha_vms_free_private;
 
  err_wrong_format:
   bfd_set_error (bfd_error_wrong_format);
@@ -2979,7 +2955,7 @@ vector_grow1 (struct vector_type *vec, size_t elsz)
              bfd_set_error (bfd_error_file_too_big);
              return NULL;
            }
-         vec->els = bfd_realloc (vec->els, amt);
+         vec->els = bfd_realloc_or_free (vec->els, amt);
        }
     }
   if (vec->els == NULL)
@@ -4284,7 +4260,7 @@ new_module (bfd *abfd)
 
 /* Parse debug info for a module and internalize it.  */
 
-static void
+static bfd_boolean
 parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
              int length)
 {
@@ -4396,9 +4372,11 @@ parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
                      {
                        module->file_table_count *= 2;
                        module->file_table
-                         = bfd_realloc (module->file_table,
-                                        module->file_table_count
-                                          * sizeof (struct fileinfo));
+                         = bfd_realloc_or_free (module->file_table,
+                                                module->file_table_count
+                                                * sizeof (struct fileinfo));
+                       if (module->file_table == NULL)
+                         return FALSE;
                      }
 
                    module->file_table [fileid].name = filename;
@@ -4720,6 +4698,7 @@ parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
      because parsing can be either performed at module creation
      or deferred until debug info is consumed.  */
   SET_MODULE_PARSED (module);
+  return TRUE;
 }
 
 /* Build the list of modules for the specified BFD.  */
@@ -4797,7 +4776,8 @@ build_module_list (bfd *abfd)
        return NULL;
 
       module = new_module (abfd);
-      parse_module (abfd, module, PRIV (dst_section)->contents, -1);
+      if (!parse_module (abfd, module, PRIV (dst_section)->contents, -1))
+       return NULL;
       list = module;
     }
 
@@ -4822,17 +4802,19 @@ module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
     {
       unsigned int size = module->size;
       unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
-      unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
+      unsigned char *buffer;
 
       if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
-         || bfd_bread (buffer, size, abfd) != size)
+         || (buffer = _bfd_malloc_and_read (abfd, size, size)) == NULL)
        {
          bfd_set_error (bfd_error_no_debug_section);
          return FALSE;
        }
 
-      parse_module (abfd, module, buffer, size);
+      ret = parse_module (abfd, module, buffer, size);
       free (buffer);
+      if (!ret)
+       return ret;
     }
 
   /* Find out the function (if any) that contains the address.  */
@@ -5306,8 +5288,10 @@ alpha_vms_slurp_relocs (bfd *abfd)
                else
                  {
                    vms_sec->reloc_max *= 2;
-                   sec->relocation = bfd_realloc
+                   sec->relocation = bfd_realloc_or_free
                      (sec->relocation, vms_sec->reloc_max * sizeof (arelent));
+                   if (sec->relocation == NULL)
+                     return FALSE;
                  }
              }
            reloc = &sec->relocation[sec->reloc_count];
@@ -7149,8 +7133,8 @@ evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
       dst_size -= len;
       off += len;
       len -= sizeof (dsth);
-      buf = bfd_malloc (len);
-      if (bfd_bread (buf, len, abfd) != len)
+      buf = _bfd_malloc_and_read (abfd, len, len);
+      if (buf == NULL)
        {
          fprintf (file, _("cannot read DST symbol\n"));
          return;
@@ -8065,14 +8049,12 @@ evax_bfd_print_image (bfd *abfd, FILE *file)
       unsigned int codeadroff;
       unsigned int lpfixoff;
       unsigned int chgprtoff;
+      file_ptr f_off = (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE;
 
-      buf = bfd_malloc (eiaf_size);
-
-      if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET)
-         || bfd_bread (buf, eiaf_size, abfd) != eiaf_size)
+      if (bfd_seek (abfd, f_off, SEEK_SET) != 0
+         || (buf = _bfd_malloc_and_read (abfd, eiaf_size, eiaf_size)) == NULL)
        {
          fprintf (file, _("cannot read EIHA\n"));
-         free (buf);
          return;
        }
       eiaf = (struct vms_eiaf *)buf;
This page took 0.027593 seconds and 4 git commands to generate.