* readelf.c (process_archive): Fix error handling. Remove memory

leak.
This commit is contained in:
Ian Lance Taylor
2003-08-11 16:34:18 +00:00
parent 15f40dfc73
commit d989285ca3
2 changed files with 22 additions and 9 deletions

View File

@ -1,5 +1,8 @@
2003-08-11 Ian Lance Taylor <ian@airs.com> 2003-08-11 Ian Lance Taylor <ian@airs.com>
* readelf.c (process_archive): Fix error handling. Remove memory
leak.
* readelf.c: Add ability to read archives. * readelf.c: Add ability to read archives.
(archive_file_offset): New variable. (archive_file_offset): New variable.
(archive_file_size): New variable. (archive_file_size): New variable.

View File

@ -10275,6 +10275,7 @@ process_archive (char *file_name, FILE *file)
char *longnames = NULL; char *longnames = NULL;
unsigned long longnames_size = 0; unsigned long longnames_size = 0;
size_t file_name_size; size_t file_name_size;
int ret;
show_name = 1; show_name = 1;
@ -10326,6 +10327,7 @@ process_archive (char *file_name, FILE *file)
if (fread (longnames, longnames_size, 1, file) != 1) if (fread (longnames, longnames_size, 1, file) != 1)
{ {
free (longnames);
error(_("%s: failed to read string table\n"), file_name); error(_("%s: failed to read string table\n"), file_name);
return 1; return 1;
} }
@ -10336,6 +10338,8 @@ process_archive (char *file_name, FILE *file)
got = fread (&arhdr, 1, sizeof arhdr, file); got = fread (&arhdr, 1, sizeof arhdr, file);
if (got != sizeof arhdr) if (got != sizeof arhdr)
{ {
free (longnames);
if (got == 0) if (got == 0)
return 0; return 0;
@ -10345,6 +10349,7 @@ process_archive (char *file_name, FILE *file)
} }
file_name_size = strlen (file_name); file_name_size = strlen (file_name);
ret = 0;
while (1) while (1)
{ {
@ -10360,7 +10365,8 @@ process_archive (char *file_name, FILE *file)
if (off >= longnames_size) if (off >= longnames_size)
{ {
error (_("%s: invalid archive string table offset %lu\n"), off); error (_("%s: invalid archive string table offset %lu\n"), off);
return 1; ret = 1;
break;
} }
name = longnames + off; name = longnames + off;
@ -10375,14 +10381,16 @@ process_archive (char *file_name, FILE *file)
if (nameend == NULL) if (nameend == NULL)
{ {
error (_("%s: bad archive file name\n")); error (_("%s: bad archive file name\n"));
return 1; ret = 1;
break;
} }
namealc = malloc (file_name_size + (nameend - name) + 3); namealc = malloc (file_name_size + (nameend - name) + 3);
if (namealc == NULL) if (namealc == NULL)
{ {
error (_("Out of memory\n")); error (_("Out of memory\n"));
return 1; ret = 1;
break;
} }
memcpy (namealc, file_name, file_name_size); memcpy (namealc, file_name, file_name_size);
@ -10394,7 +10402,7 @@ process_archive (char *file_name, FILE *file)
archive_file_offset = ftell (file); archive_file_offset = ftell (file);
archive_file_size = strtoul (arhdr.ar_size, NULL, 10); archive_file_size = strtoul (arhdr.ar_size, NULL, 10);
process_object (namealc, file); ret |= process_object (namealc, file);
free (namealc); free (namealc);
@ -10405,24 +10413,26 @@ process_archive (char *file_name, FILE *file)
SEEK_SET) != 0) SEEK_SET) != 0)
{ {
error (_("%s: failed to seek to next archive header\n"), file_name); error (_("%s: failed to seek to next archive header\n"), file_name);
return 1; ret = 1;
break;
} }
got = fread (&arhdr, 1, sizeof arhdr, file); got = fread (&arhdr, 1, sizeof arhdr, file);
if (got != sizeof arhdr) if (got != sizeof arhdr)
{ {
if (got == 0) if (got == 0)
return 0; break;
error (_("%s: failed to read archive header\n"), file_name); error (_("%s: failed to read archive header\n"), file_name);
return 1; ret = 1;
break;
} }
} }
if (longnames != 0) if (longnames != 0)
free (longnames); free (longnames);
return 0; return ret;
} }
static int static int