mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 12:22:20 +08:00
* readelf.c (process_archive): Fix error handling. Remove memory
leak.
This commit is contained in:
@ -1,4 +1,7 @@
|
|||||||
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.
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user