[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; }