Plug one of many possible memory leaks in error handling.
authorNick Clifton <nickc@redhat.com>
Wed, 25 Oct 2000 21:53:44 +0000 (21:53 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 25 Oct 2000 21:53:44 +0000 (21:53 +0000)
bfd/ChangeLog
bfd/ieee.c

index 51a601f..f8013f6 100644 (file)
@@ -1,3 +1,8 @@
+2000-10-25  Chris Demetriou  <cgd@sibyte.com>
+
+       * ieee.c (ieee_archive_p): Plug one of many possible
+       memory leaks in error handling.
+
 2000-10-20  Jakub Jelinek  <jakub@redhat.com>
 
        * elf32-sparc.c (elf32_sparc_merge_private_bfd_data,
index 69d3edc..70f0d13 100644 (file)
@@ -1343,27 +1343,21 @@ ieee_archive_p (abfd)
   ieee->h.abfd = abfd;
 
   if (this_byte (&(ieee->h)) != Module_Beginning)
-    {
-      abfd->tdata.ieee_ar_data = save;
-      goto got_wrong_format_error;
-    }
+    goto got_wrong_format_error;
 
   next_byte (&(ieee->h));
   library = read_id (&(ieee->h));
   if (strcmp (library, "LIBRARY") != 0)
-    {
-      bfd_release (abfd, ieee);
-      abfd->tdata.ieee_ar_data = save;
-      goto got_wrong_format_error;
-    }
-  /* Throw away the filename */
+    goto got_wrong_format_error;
+
+  /* Throw away the filename.  */
   read_id (&(ieee->h));
 
   ieee->element_count = 0;
   ieee->element_index = 0;
 
-  next_byte (&(ieee->h));      /* Drop the ad part */
-  must_parse_int (&(ieee->h)); /* And the two dummy numbers */
+  next_byte (&(ieee->h));      /* Drop the ad part */
+  must_parse_int (&(ieee->h)); /* And the two dummy numbers */
   must_parse_int (&(ieee->h));
 
   alc_elts = 10;
@@ -1371,7 +1365,7 @@ ieee_archive_p (abfd)
   if (elts == NULL)
     goto error_return;
 
-  /* Read the index of the BB table */
+  /* Read the index of the BB table */
   while (1)
     {
       int rec;
@@ -1400,14 +1394,14 @@ ieee_archive_p (abfd)
       t->file_offset = must_parse_int (&(ieee->h));
       t->abfd = (bfd *) NULL;
 
-      /* Make sure that we don't go over the end of the buffer */
-
+      /* Make sure that we don't go over the end of the buffer.  */
       if ((size_t) ieee_pos (abfd) > sizeof (buffer) / 2)
        {
-         /* Past half way, reseek and reprime */
+         /* Past half way, reseek and reprime */
          buffer_offset += ieee_pos (abfd);
          if (bfd_seek (abfd, buffer_offset, SEEK_SET) != 0)
            goto error_return;
+
          /* FIXME: Check return value.  I'm not sure whether it needs
             to read the entire buffer or not.  */
          bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
@@ -1421,36 +1415,33 @@ ieee_archive_p (abfd)
                               ieee->element_count * sizeof *ieee->elements));
   if (ieee->elements == NULL)
     goto error_return;
+
   memcpy (ieee->elements, elts,
          ieee->element_count * sizeof *ieee->elements);
   free (elts);
   elts = NULL;
 
-  /* Now scan the area again, and replace BB offsets with file */
-  /* offsets */
-
+  /* Now scan the area again, and replace BB offsets with file offsets.  */
   for (i = 2; i < ieee->element_count; i++)
     {
       if (bfd_seek (abfd, ieee->elements[i].file_offset, SEEK_SET) != 0)
        goto error_return;
+
       /* FIXME: Check return value.  I'm not sure whether it needs to
         read the entire buffer or not.  */
       bfd_read ((PTR) buffer, 1, sizeof (buffer), abfd);
       ieee->h.first_byte = buffer;
       ieee->h.input_p = buffer;
 
-      next_byte (&(ieee->h));  /* Drop F8 */
-      next_byte (&(ieee->h));  /* Drop 14 */
-      must_parse_int (&(ieee->h));     /* Drop size of block */
+      next_byte (&(ieee->h));          /* Drop F8.  */
+      next_byte (&(ieee->h));          /* Drop 14.  */
+      must_parse_int (&(ieee->h));     /* Drop size of block.  */
+      
       if (must_parse_int (&(ieee->h)) != 0)
-       {
-         /* This object has been deleted */
-         ieee->elements[i].file_offset = 0;
-       }
+       /* This object has been deleted.  */
+       ieee->elements[i].file_offset = 0;
       else
-       {
-         ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
-       }
+       ieee->elements[i].file_offset = must_parse_int (&(ieee->h));
     }
 
   /*  abfd->has_armap = ;*/
@@ -1458,10 +1449,14 @@ ieee_archive_p (abfd)
   return abfd->xvec;
 
  got_wrong_format_error:
+  bfd_release (abfd, ieee);
+  abfd->tdata.ieee_ar_data = save;
   bfd_set_error (bfd_error_wrong_format);
+
  error_return:
   if (elts != NULL)
     free (elts);
+
   return NULL;
 }