SEEK_SET))
{
error (_("Unable to seek to start of dynamic information\n"));
- return 0;
+ goto no_hash;
}
if (fread (nb, hash_ent_size, 1, file) != 1)
{
error (_("Failed to read in number of buckets\n"));
- return 0;
+ goto no_hash;
}
if (fread (nc, hash_ent_size, 1, file) != 1)
{
error (_("Failed to read in number of chains\n"));
- return 0;
+ goto no_hash;
}
nbuckets = byte_get (nb, hash_ent_size);
buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
chains = get_dynamic_data (file, nchains, hash_ent_size);
+ no_hash:
if (buckets == NULL || chains == NULL)
- return 0;
+ {
+ if (do_using_dynamic)
+ return 0;
+ free (buckets);
+ free (chains);
+ buckets = NULL;
+ chains = NULL;
+ nbuckets = 0;
+ nchains = 0;
+ }
}
if (dynamic_info_DT_GNU_HASH
SEEK_SET))
{
error (_("Unable to seek to start of dynamic information\n"));
- return 0;
+ goto no_gnu_hash;
}
if (fread (nb, 16, 1, file) != 1)
{
error (_("Failed to read in number of buckets\n"));
- return 0;
+ goto no_gnu_hash;
}
ngnubuckets = byte_get (nb, 4);
SEEK_SET))
{
error (_("Unable to seek to start of dynamic information\n"));
- return 0;
+ goto no_gnu_hash;
}
gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
if (gnubuckets == NULL)
- return 0;
+ goto no_gnu_hash;
for (i = 0; i < ngnubuckets; i++)
if (gnubuckets[i] != 0)
}
if (maxchain == 0xffffffff)
- return 0;
+ goto no_gnu_hash;
maxchain -= gnusymidx;
SEEK_SET))
{
error (_("Unable to seek to start of dynamic information\n"));
- return 0;
+ goto no_gnu_hash;
}
do
if (fread (nb, 4, 1, file) != 1)
{
error (_("Failed to determine last chain length\n"));
- return 0;
+ goto no_gnu_hash;
}
if (maxchain + 1 == 0)
- return 0;
+ goto no_gnu_hash;
++maxchain;
}
SEEK_SET))
{
error (_("Unable to seek to start of dynamic information\n"));
- return 0;
+ goto no_gnu_hash;
}
gnuchains = get_dynamic_data (file, maxchain, 4);
+ no_gnu_hash:
if (gnuchains == NULL)
- return 0;
+ {
+ free (gnubuckets);
+ if (do_using_dynamic)
+ return 0;
+ gnubuckets = NULL;
+ ngnubuckets = 0;
+ }
}
if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
free (chains);
}
- if (do_histogram && dynamic_info_DT_GNU_HASH)
+ if (do_histogram && gnubuckets != NULL)
{
unsigned long * lengths;
unsigned long * counts;