diff options
author | Nick Clifton <nickc@redhat.com> | 2000-10-25 21:53:44 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2000-10-25 21:53:44 +0000 |
commit | c4920b9772c1779d6d9b02bc13ebb8f36150f73c (patch) | |
tree | 61fa5be4c134fe4c1d020cb01fe1160d31a6c314 | |
parent | 53d2c54b5bcd907c1c7239b148171cb560ff4d04 (diff) | |
download | gdb-c4920b9772c1779d6d9b02bc13ebb8f36150f73c.zip gdb-c4920b9772c1779d6d9b02bc13ebb8f36150f73c.tar.gz gdb-c4920b9772c1779d6d9b02bc13ebb8f36150f73c.tar.bz2 |
Plug one of many possible memory leaks in error handling.
-rw-r--r-- | bfd/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/ieee.c | 53 |
2 files changed, 29 insertions, 29 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 51a601f..f8013f6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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, @@ -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; } |