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:
Siddhesh Poyarekar 2021-05-18 09:08:41 +05:30
parent 2317101658
commit a85cdcdb35
1 changed files with 12 additions and 4 deletions

View File

@ -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;