unusual eh_frame memory leak

Message ID Z5Hk3xAWj-UZoHXQ@squeak.grove.modra.org
State New
Headers
Series unusual eh_frame memory leak |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 fail Patch failed to apply

Commit Message

Alan Modra Jan. 23, 2025, 6:42 a.m. UTC
  This one happens with --gc-sections and a linker script that either
discards some or all .eh_frame sections (eg. ld-elf/pr14265 test) or
maps an input .eh_frame to some other named output section.  In that
case the discarded/renamed .eh_frame won't have local_cies freed.

	* elf-eh-frame.c (_bfd_elf_parse_eh_frame): Correct comment.
	* elf.c (_bfd_elf_free_cached_info): Free eh_frame cies.
  

Patch

diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index dd6802b05fd..08ffc5f1b4a 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -606,7 +606,9 @@  _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info,
       || (sec->flags & SEC_HAS_CONTENTS) == 0
       || sec->sec_info_type != SEC_INFO_TYPE_NONE)
     {
-      /* This file does not contain .eh_frame information.  */
+      /* This file does not contain .eh_frame information or
+	 .eh_frame has already been parsed, as can happen with
+	 --gc-sections.  */
       return;
     }
 
diff --git a/bfd/elf.c b/bfd/elf.c
index 4fa8a2a7911..0fa580d8d78 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -10134,6 +10134,12 @@  _bfd_elf_free_cached_info (bfd *abfd)
 	    }
 	  free (elf_section_data (sec)->relocs);
 	  elf_section_data (sec)->relocs = NULL;
+	  if (sec->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
+	    {
+	      struct eh_frame_sec_info *sec_info
+		= elf_section_data (sec)->sec_info;
+	      free (sec_info->cies);
+	    }
 	}
       free (tdata->symtab_hdr.contents);
       tdata->symtab_hdr.contents = NULL;