]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Free sframe encoder context
authorAlan Modra <amodra@gmail.com>
Wed, 11 Feb 2026 05:01:33 +0000 (15:31 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 11 Feb 2026 05:01:33 +0000 (15:31 +1030)
Like the patch to free sframe decoder data, this also needs to ensure
the function doing the free is passed the actual context address.

bfd/
* elf-sframe.c (_bfd_elf_write_section_sframe): Don't pass
address of local var to sframe_encoder_free, pass the actual
context address.
* elf64-s390.c (elf_s390_link_hash_table_free): New function.
(elf_s390_link_hash_table_create): Set hash_table_free.  Tidy
zmalloc call.
(_bfd_s390_elf_write_sframe_plt): Don't pass address of local
var to sframe_encoder_free, pass the actual context address.
* elflink.c: Include sframe-api.h.
(_bfd_elf_link_hash_table_free): Free sframe encoder data.
* elfxx-x86.c (elf_x86_link_hash_table_free): Likewise.
(_bfd_x86_elf_write_sframe_plt): Don't pass address of local
var to sframe_encoder_free, pass the actual context address.
libsframe/
* sframe.c (sframe_encode): Free context on error return path.

bfd/elf-sframe.c
bfd/elf64-s390.c
bfd/elflink.c
bfd/elfxx-x86.c
libsframe/sframe.c

index c28f1236a2fbcfee6685ab101e51b7e63dd86a15..7b2eed81c9f43839955224dd813e7b5f7c38cd88 100644 (file)
@@ -730,7 +730,7 @@ _bfd_elf_write_section_sframe (bfd *abfd, struct bfd_link_info *info)
       hdr->sh_size = sec->size;
     }
 
-  sframe_encoder_free (&sfe_ctx);
+  sframe_encoder_free (&sfe_info->sfe_ctx);
 
   return retval;
 }
index 6f6c28bedcebd8c9ec9610b4e8bec6979bdcab72..3925cf6494d3b36365db95ac5bee4f2265a0c6f5 100644 (file)
@@ -790,15 +790,23 @@ link_hash_newfunc (struct bfd_hash_entry *entry,
   return entry;
 }
 
+static void
+elf_s390_link_hash_table_free (bfd *obfd)
+{
+  struct elf_s390_link_hash_table *htab
+    = (struct elf_s390_link_hash_table *) obfd->link.hash;
+  sframe_encoder_free (&htab->plt_cfe_ctx);
+  _bfd_elf_link_hash_table_free (obfd);
+}
+
 /* Create an s390 ELF linker hash table.  */
 
 static struct bfd_link_hash_table *
 elf_s390_link_hash_table_create (bfd *abfd)
 {
   struct elf_s390_link_hash_table *ret;
-  size_t amt = sizeof (struct elf_s390_link_hash_table);
 
-  ret = (struct elf_s390_link_hash_table *) bfd_zmalloc (amt);
+  ret = bfd_zmalloc (sizeof (*ret));
   if (ret == NULL)
     return NULL;
 
@@ -808,6 +816,7 @@ elf_s390_link_hash_table_create (bfd *abfd)
       free (ret);
       return NULL;
     }
+  ret->elf.root.hash_table_free = elf_s390_link_hash_table_free;
 
   return &ret->elf.root;
 }
@@ -1669,7 +1678,7 @@ static bool
 _bfd_s390_elf_write_sframe_plt (struct bfd_link_info *info)
 {
   struct elf_s390_link_hash_table *htab;
-  sframe_encoder_ctx *ectx;
+  sframe_encoder_ctx **ectx;
   size_t sec_size;
   asection *sec;
   bfd *dynobj;
@@ -1679,19 +1688,19 @@ _bfd_s390_elf_write_sframe_plt (struct bfd_link_info *info)
   htab = elf_s390_hash_table (info);
   dynobj = htab->elf.dynobj;
 
-  ectx = htab->plt_cfe_ctx;
+  ectx = &htab->plt_cfe_ctx;
   sec = htab->plt_sframe;
 
-  BFD_ASSERT (ectx);
+  BFD_ASSERT (*ectx);
 
-  void *contents = sframe_encoder_write (ectx, &sec_size, false, &err);
+  void *contents = sframe_encoder_write (*ectx, &sec_size, false, &err);
 
   sec->size = (bfd_size_type) sec_size;
   sec->contents = (unsigned char *) bfd_zalloc (dynobj, sec->size);
   sec->alloced = 1;
   memcpy (sec->contents, contents, sec_size);
 
-  sframe_encoder_free (&ectx);
+  sframe_encoder_free (ectx);
 
   return true;
 }
index 29b89d4ab9ed9edc59b714fcc08379efe43f2695..78751f957c42e3bcd89b7f75ed125184332ea7d9 100644 (file)
@@ -24,6 +24,7 @@
 #include "libbfd.h"
 #define ARCH_SIZE 0
 #include "elf-bfd.h"
+#include "sframe-api.h"
 #include "safe-ctype.h"
 #include "libiberty.h"
 #include "objalloc.h"
@@ -8457,6 +8458,7 @@ _bfd_elf_link_hash_table_free (bfd *obfd)
     free (htab->eh_info.u.compact.entries);
   else
     free (htab->eh_info.u.dwarf.array);
+  sframe_encoder_free (&htab->sfe_info.sfe_ctx);
   _bfd_generic_link_hash_table_free (obfd);
 }
 
index f476c04c8885ba7890ada881a499b8e3c2ecc7dc..f3c267f5fccb37e3927828a63497f993dc1a5493 100644 (file)
@@ -695,6 +695,9 @@ elf_x86_link_hash_table_free (bfd *obfd)
     htab_delete (htab->loc_hash_table);
   if (htab->loc_hash_memory)
     objalloc_free ((struct objalloc *) htab->loc_hash_memory);
+  sframe_encoder_free (&htab->plt_cfe_ctx);
+  sframe_encoder_free (&htab->plt_second_cfe_ctx);
+  sframe_encoder_free (&htab->plt_got_cfe_ctx);
   _bfd_elf_link_hash_table_free (obfd);
 }
 
@@ -1975,7 +1978,7 @@ _bfd_x86_elf_write_sframe_plt (bfd *output_bfd,
 {
   struct elf_x86_link_hash_table *htab;
   elf_backend_data *bed;
-  sframe_encoder_ctx *ectx;
+  sframe_encoder_ctx **ectx;
   size_t sec_size;
   asection *sec;
   bfd *dynobj;
@@ -1989,15 +1992,15 @@ _bfd_x86_elf_write_sframe_plt (bfd *output_bfd,
   switch (plt_sec_type)
     {
     case SFRAME_PLT:
-      ectx = htab->plt_cfe_ctx;
+      ectx = &htab->plt_cfe_ctx;
       sec = htab->plt_sframe;
       break;
     case SFRAME_PLT_SEC:
-      ectx = htab->plt_second_cfe_ctx;
+      ectx = &htab->plt_second_cfe_ctx;
       sec = htab->plt_second_sframe;
       break;
     case SFRAME_PLT_GOT:
-      ectx = htab->plt_got_cfe_ctx;
+      ectx = &htab->plt_got_cfe_ctx;
       sec = htab->plt_got_sframe;
       break;
     default:
@@ -2006,16 +2009,16 @@ _bfd_x86_elf_write_sframe_plt (bfd *output_bfd,
       break;
     }
 
-  BFD_ASSERT (ectx);
+  BFD_ASSERT (*ectx);
 
-  void *contents = sframe_encoder_write (ectx, &sec_size, false, &err);
+  void *contents = sframe_encoder_write (*ectx, &sec_size, false, &err);
 
   sec->size = (bfd_size_type) sec_size;
   sec->contents = (unsigned char *) bfd_zalloc (dynobj, sec->size);
   sec->alloced = 1;
   memcpy (sec->contents, contents, sec_size);
 
-  sframe_encoder_free (&ectx);
+  sframe_encoder_free (ectx);
 
   return true;
 }
index 37590f3c11c3fb05161398d64d846d0a2e03febb..cd6bb3022db37b843005ba9113ba2b9ed8397ed0 100644 (file)
@@ -1990,7 +1990,10 @@ sframe_encode (uint8_t ver, uint8_t flags, uint8_t abi_arch,
      sframe_encoder_write_sframe assume flag SFRAME_F_FDE_FUNC_START_PCREL
      set.  */
   if (!(flags & SFRAME_F_FDE_FUNC_START_PCREL))
-   return sframe_ret_set_errno (errp, SFRAME_ERR_ECTX_INVAL);
+    {
+      free (ectx);
+      return sframe_ret_set_errno (errp, SFRAME_ERR_ECTX_INVAL);
+    }
 
   hp->sfh_abi_arch = abi_arch;
   hp->sfh_cfa_fixed_fp_offset = fixed_fp_offset;