[binutils-gdb/binutils-2_46-branch] Correct calls to sframe_encoder_free

Alan Modra amodra@sourceware.org
Wed May 27 03:35:41 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e6336a0b1c4613675c760df5a29a6c80e6d0b816

commit e6336a0b1c4613675c760df5a29a6c80e6d0b816
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Feb 11 15:31:33 2026 +1030

    Correct calls to sframe_encoder_free
    
    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_create): 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.
            * elfxx-x86.c (_bfd_x86_elf_write_sframe_plt): Likewise.
    
    (big-fix cherry-pick from 3949fb481a6739dc1f4dc5fad09d7646c90af3d2
     without the extra encoder frees)

Diff:
---
 bfd/elf-sframe.c |  2 +-
 bfd/elf64-s390.c | 13 ++++++-------
 bfd/elfxx-x86.c  | 14 +++++++-------
 3 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/bfd/elf-sframe.c b/bfd/elf-sframe.c
index c28f1236a2f..7b2eed81c9f 100644
--- a/bfd/elf-sframe.c
+++ b/bfd/elf-sframe.c
@@ -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;
 }
diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
index 6f6c28bedce..8fb0054b27f 100644
--- a/bfd/elf64-s390.c
+++ b/bfd/elf64-s390.c
@@ -796,9 +796,8 @@ 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;
 
@@ -1669,7 +1668,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 +1678,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;
 }
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index f476c04c888..bae9464921f 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -1975,7 +1975,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 +1989,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 +2006,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;
 }


More information about the Binutils-cvs mailing list