From: Siddhesh Poyarekar Date: Tue, 18 May 2021 03:38:41 +0000 (+0530) Subject: elf/cache.c: Fix resource leaks identified by static analyzers X-Git-Tag: glibc-2.34~394 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a85cdcdb35ed693d0e6eae63dfaca0cffae12765;p=thirdparty%2Fglibc.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 --- diff --git a/elf/cache.c b/elf/cache.c index c01d3020721..8a3404923c6 100644 --- a/elf/cache.c +++ b/elf/cache.c @@ -547,6 +547,7 @@ write_extensions (int fd, uint32_t str_offset, || write (fd, generator, strlen (generator)) != strlen (generator)) error (EXIT_FAILURE, errno, _("Writing of cache extension data failed")); + free (hwcaps_array); free (ext); } @@ -778,6 +779,7 @@ save_cache (const char *cache_name) free (file_entries_new); free (file_entries); free (strings_finalized.strings); + free (temp_name); 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->len_strings)) { + if (aux_cache != MAP_FAILED) + munmap (aux_cache, aux_cache_size); + close (fd); init_aux_cache (); return; @@ -1143,10 +1148,13 @@ save_aux_cache (const char *aux_cache_name) if (fd < 0) goto out_fail; - if (write (fd, file_entries, file_entries_size + total_strlen) - != (ssize_t) (file_entries_size + total_strlen) - || fdatasync (fd) != 0 - || close (fd) != 0) + bool fail = ((write (fd, file_entries, file_entries_size + total_strlen) + != (ssize_t) (file_entries_size + total_strlen)) + || fdatasync (fd) != 0); + + fail |= close (fd) != 0; + + if (fail) { unlink (temp_name); goto out_fail;