Stop potential memory leaks in dwarf CIE reader.

* dwarf.c (read_cie): Free allocated memory before returning with
	a failure result.
This commit is contained in:
Nick Clifton 2018-07-19 14:23:31 +01:00
parent 43cc6c3adb
commit 442a6ce858
3 changed files with 26 additions and 13 deletions

View file

@ -1,3 +1,8 @@
2018-07-19 Nick Clifton <nickc@redhat.com>
* dwarf.c (read_cie): Free allocated memory before returning with
a failure result.
2018-07-16 Pedro Franco de Carvalho <pedromfc@linux.ibm.com> 2018-07-16 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
* readelf.c (get_note_type): Fix typo in NT_PPC_TM_CVSX note * readelf.c (get_note_type): Fix typo in NT_PPC_TM_CVSX note

View file

@ -315,6 +315,10 @@ looks like this:
a. Update the minor release number in bfd/version.m4. a. Update the minor release number in bfd/version.m4.
b. Edit bfd/development.sh and set "development=false". b. Edit bfd/development.sh and set "development=false".
c. Regenerate the configure files. c. Regenerate the configure files.
c.1. Remove spurious autom4te.cache files:
find . -depth -name autom4te.cache -exec rm -r {} \;
d. Commit the updates along with a "this-is-the-2.XX.X-release" d. Commit the updates along with a "this-is-the-2.XX.X-release"
note in all of the changelogs. note in all of the changelogs.
e. Tag the branch with the new release number: e. Tag the branch with the new release number:
@ -339,9 +343,6 @@ looks like this:
k. Clean up the source tree. (Use "git status" to find new k. Clean up the source tree. (Use "git status" to find new
files, and remove them). files, and remove them).
FIXME: The tarballs will contain spurious autom4te.cache
directories which could be removed to reduce their size.
4. [If paranoid - upload the tarballs to one of the FTP servers and 4. [If paranoid - upload the tarballs to one of the FTP servers and
ask people to test it before going on to step 5]. ask people to test it before going on to step 5].
@ -354,18 +355,17 @@ looks like this:
6. Upload the tarballs to sourceware.org: 6. Upload the tarballs to sourceware.org:
sftp sourceware.org sftp sourceware.org
cd /ftp/pub/binutils/releases cd /sourceware/ftp/pub/binutils/releases
put binutils-X.XX.X.tar.* put binutils-X.XX.X.tar.*
chmod 644 binutils-X.XX.X.tar.* chmod 644 binutils-X.XX.X.tar.*
quit quit
FIXME: Should the signatures (created by the gnupload script in It is OK to upload the signatures as well.
step 5) be uploaded as well ?
7. Update web pages. For sourceware.org: 7. Update web pages. For sourceware.org:
* Log on to sourceware.org * Log on to sourceware.org
* Go /www/htdocs/binutils * Go to /sourceware/www/sourceware/htdocs/binutils
* Edit index.html * Edit index.html
For the www.gnu.org site you have to email webmasters@gnu.org For the www.gnu.org site you have to email webmasters@gnu.org
@ -378,8 +378,8 @@ looks like this:
------------------------------------------------------------------------ ------------------------------------------------------------------------
Hi Everyone, Hi Everyone,
We are pleased to announce that version 2.XX.X of the Binutils project We are pleased to announce that version 2.XX.X of the GNU Binutils
sources have been released and are now available for download at: project sources have been released and are now available for download at:
https://ftp.gnu.org/gnu/binutils https://ftp.gnu.org/gnu/binutils
https://sourceware.org/pub/binutils/releases/ https://sourceware.org/pub/binutils/releases/

View file

@ -7283,7 +7283,7 @@ read_cie (unsigned char *start, unsigned char *end,
if (start == end) if (start == end)
{ {
warn (_("No terminator for augmentation name\n")); warn (_("No terminator for augmentation name\n"));
return start; goto fail;
} }
if (strcmp (fc->augmentation, "eh") == 0) if (strcmp (fc->augmentation, "eh") == 0)
@ -7295,7 +7295,7 @@ read_cie (unsigned char *start, unsigned char *end,
if (fc->ptr_size < 1 || fc->ptr_size > 8) if (fc->ptr_size < 1 || fc->ptr_size > 8)
{ {
warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size); warn (_("Invalid pointer size (%d) in CIE data\n"), fc->ptr_size);
return end; goto fail;
} }
GET (fc->segment_size, 1); GET (fc->segment_size, 1);
@ -7303,7 +7303,7 @@ read_cie (unsigned char *start, unsigned char *end,
if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8) if (fc->segment_size > 8 || fc->segment_size + fc->ptr_size > 8)
{ {
warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size); warn (_("Invalid segment size (%d) in CIE data\n"), fc->segment_size);
return end; goto fail;
} }
eh_addr_size = fc->ptr_size; eh_addr_size = fc->ptr_size;
@ -7313,8 +7313,10 @@ read_cie (unsigned char *start, unsigned char *end,
fc->ptr_size = eh_addr_size; fc->ptr_size = eh_addr_size;
fc->segment_size = 0; fc->segment_size = 0;
} }
READ_ULEB (fc->code_factor); READ_ULEB (fc->code_factor);
READ_SLEB (fc->data_factor); READ_SLEB (fc->data_factor);
if (version == 1) if (version == 1)
{ {
GET (fc->ra, 1); GET (fc->ra, 1);
@ -7334,7 +7336,7 @@ read_cie (unsigned char *start, unsigned char *end,
warn (_("Augmentation data too long: 0x%s, expected at most %#lx\n"), warn (_("Augmentation data too long: 0x%s, expected at most %#lx\n"),
dwarf_vmatoa ("x", augmentation_data_len), dwarf_vmatoa ("x", augmentation_data_len),
(unsigned long) (end - start)); (unsigned long) (end - start));
return end; goto fail;
} }
start += augmentation_data_len; start += augmentation_data_len;
} }
@ -7376,6 +7378,12 @@ read_cie (unsigned char *start, unsigned char *end,
*p_aug = augmentation_data; *p_aug = augmentation_data;
} }
return start; return start;
fail:
free (fc->col_offset);
free (fc->col_type);
free (fc);
return end;
} }
/* Prints out the contents on the DATA array formatted as unsigned bytes. /* Prints out the contents on the DATA array formatted as unsigned bytes.