mirror of git://sourceware.org/git/glibc.git
elf/cache.c: Fix resource leaks identified by static analyzers
A coverity run identified a number of resource leaks in cache.c. There are a couple of simple memory leaks where a local allocation is not freed before function return. Then there is a mmap leak and a file descriptor leak where a map is not unmapped in the error case and a file descriptor remains open respectively. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
2317101658
commit
a85cdcdb35
16
elf/cache.c
16
elf/cache.c
|
|
@ -547,6 +547,7 @@ write_extensions (int fd, uint32_t str_offset,
|
||||||
|| write (fd, generator, strlen (generator)) != strlen (generator))
|
|| write (fd, generator, strlen (generator)) != strlen (generator))
|
||||||
error (EXIT_FAILURE, errno, _("Writing of cache extension data failed"));
|
error (EXIT_FAILURE, errno, _("Writing of cache extension data failed"));
|
||||||
|
|
||||||
|
free (hwcaps_array);
|
||||||
free (ext);
|
free (ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -778,6 +779,7 @@ save_cache (const char *cache_name)
|
||||||
free (file_entries_new);
|
free (file_entries_new);
|
||||||
free (file_entries);
|
free (file_entries);
|
||||||
free (strings_finalized.strings);
|
free (strings_finalized.strings);
|
||||||
|
free (temp_name);
|
||||||
|
|
||||||
while (entries)
|
while (entries)
|
||||||
{
|
{
|
||||||
|
|
@ -1034,6 +1036,9 @@ load_aux_cache (const char *aux_cache_name)
|
||||||
+ aux_cache->nlibs * sizeof (struct aux_cache_file_entry)
|
+ aux_cache->nlibs * sizeof (struct aux_cache_file_entry)
|
||||||
+ aux_cache->len_strings))
|
+ aux_cache->len_strings))
|
||||||
{
|
{
|
||||||
|
if (aux_cache != MAP_FAILED)
|
||||||
|
munmap (aux_cache, aux_cache_size);
|
||||||
|
|
||||||
close (fd);
|
close (fd);
|
||||||
init_aux_cache ();
|
init_aux_cache ();
|
||||||
return;
|
return;
|
||||||
|
|
@ -1143,10 +1148,13 @@ save_aux_cache (const char *aux_cache_name)
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
goto out_fail;
|
goto out_fail;
|
||||||
|
|
||||||
if (write (fd, file_entries, file_entries_size + total_strlen)
|
bool fail = ((write (fd, file_entries, file_entries_size + total_strlen)
|
||||||
!= (ssize_t) (file_entries_size + total_strlen)
|
!= (ssize_t) (file_entries_size + total_strlen))
|
||||||
|| fdatasync (fd) != 0
|
|| fdatasync (fd) != 0);
|
||||||
|| close (fd) != 0)
|
|
||||||
|
fail |= close (fd) != 0;
|
||||||
|
|
||||||
|
if (fail)
|
||||||
{
|
{
|
||||||
unlink (temp_name);
|
unlink (temp_name);
|
||||||
goto out_fail;
|
goto out_fail;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue