From 3391569f218cd5d05e96769f47559d5828be3acd Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 20 Jul 2018 15:05:34 +0100 Subject: [PATCH] Close memory and resource leaks detected by coverity in the binutils directory. * objcopy.c (add_specific_symbols): Free buffer on exit. (add_redefine_syms_file): Close file handle on exit. (copy_object): Close file handle on early exit. Free buffer on early exit. Free gaps buffers once they are no longer needed. * dwarf.c (display_debug_frames): Free allocated memory on exit. (load_separate_debug_info): Free allocate memory on early exit. --- binutils/ChangeLog | 10 ++++++++++ binutils/dwarf.c | 37 ++++++++++++++++++++++++++++++++++--- binutils/objcopy.c | 9 +++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index df05bc04f91..bcc5c786557 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,13 @@ +2018-07-20 Nick Clifton + + * objcopy.c (add_specific_symbols): Free buffer on exit. + (add_redefine_syms_file): Close file handle on exit. + (copy_object): Close file handle on early exit. + Free buffer on early exit. + Free gaps buffers once they are no longer needed. + * dwarf.c (display_debug_frames): Free allocated memory on exit. + (load_separate_debug_info): Free allocate memory on early exit. + 2018-07-20 Chenghua Xu Maciej W. Rozycki diff --git a/binutils/dwarf.c b/binutils/dwarf.c index d609df4c117..b6c0a3af869 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -7429,10 +7429,10 @@ display_debug_frames (struct dwarf_section *section, unsigned char *start = section->start; unsigned char *end = start + section->size; unsigned char *section_start = start; - Frame_Chunk *chunks = 0, *forward_refs = 0; - Frame_Chunk *remembered_state = 0; + Frame_Chunk *chunks = NULL, *forward_refs = NULL; + Frame_Chunk *remembered_state = NULL; Frame_Chunk *rs; - int is_eh = strcmp (section->name, ".eh_frame") == 0; + bfd_boolean is_eh = strcmp (section->name, ".eh_frame") == 0; unsigned int length_return; unsigned int max_regs = 0; const char *bad_reg = _("bad register: "); @@ -8365,6 +8365,36 @@ display_debug_frames (struct dwarf_section *section, printf ("\n"); + while (remembered_state != NULL) + { + rs = remembered_state; + remembered_state = rs->next; + free (rs->col_type); + free (rs->col_offset); + rs->next = NULL; /* Paranoia. */ + free (rs); + } + + while (chunks != NULL) + { + rs = chunks; + chunks = rs->next; + free (rs->col_type); + free (rs->col_offset); + rs->next = NULL; /* Paranoia. */ + free (rs); + } + + while (forward_refs != NULL) + { + rs = forward_refs; + forward_refs = rs->next; + free (rs->col_type); + free (rs->col_offset); + rs->next = NULL; /* Paranoia. */ + free (rs); + } + return 1; } @@ -9793,6 +9823,7 @@ load_separate_debug_info (const char * main_filename, if (debugfile == NULL) { warn (_("Out of memory")); + free (canon_dir); return NULL; } diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 35637923043..25a88c9e8df 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1142,6 +1142,8 @@ add_specific_symbols (const char *filename, htab_t htab) line = eol; line_count ++; } + + free (buffer); } /* See whether a symbol should be stripped or kept @@ -1817,6 +1819,7 @@ add_redefine_syms_file (const char *filename) fatal (_("%s:%d: premature end of file"), filename, lineno); free (buf); + fclose (file); } /* Copy unknown object file IBFD onto OBFD. @@ -2823,6 +2826,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) pdump->filename, strerror (errno)); free (contents); + fclose (f); return FALSE; } } @@ -3153,6 +3157,7 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) off, now)) { bfd_nonfatal_message (NULL, obfd, osections[i], NULL); + free (buf); return FALSE; } @@ -3161,6 +3166,10 @@ copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) } } } + + free (buf); + free (gaps); + gaps = NULL; } /* Allow the BFD backend to copy any private data it understands -- 2.30.2