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

Alan Modra via Binutils-cvs <[email protected]>
Newsgroups gmane.comp.gnu.binutils.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e6336a0b1c4613675c760df5a29a6c80e6d0b816

commit e6336a0b1c4613675c760df5a29a6c80e6d0b816
Author: Alan Modra <[email protected]>
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;
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.