From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ot1-x32b.google.com (mail-ot1-x32b.google.com [IPv6:2607:f8b0:4864:20::32b]) by sourceware.org (Postfix) with ESMTPS id 0DA0D3858D39 for ; Wed, 10 Apr 2024 01:42:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0DA0D3858D39 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 0DA0D3858D39 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::32b ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712713325; cv=none; b=BtRZV1OS6SL2N8qkBgct7bDhICzArriClrmhAppb5azQAHFmPnoSfB7vaezGqLdGKtrEpg3ZSLXZy4LzMgP4mTY30Qa9/DZ8EPu1NZKN6jKnTXUGlltoforurKDCAgr/zXwc7I2/esQspJCaweaKffGiPQh/+siH9OCj4br6u+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712713325; c=relaxed/simple; bh=2IcM1HK97YHRX9Z2kg3syHtJno1c/EHzVqrh+4IOfxA=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=fF/51nSpUcqHi2dePojpKCVqu8ZW6BdGxJ77rddKyQJa+I3IwbILl0afrgL+lmQaylbJxolEdDRt7DK92qUz8A9+exTh03AZp9/dGNmBDKbBuu7xW981tzpsxDKKHExVTd2i648rapBthruoS7dMqCPqhmXSdUYnpRfi1I9eEt0= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ot1-x32b.google.com with SMTP id 46e09a7af769-6ea11ebde37so968053a34.1 for ; Tue, 09 Apr 2024 18:42:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712713321; x=1713318121; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=dFTLhk0vdeXop5H6NbS6EGjp12U1dTTjdfWDU35lNWw=; b=NowUNPq9cQdT7Maebz7Bo320R69OdTEL9MHA8DGum3MbbpdB07x29RpPPtWXs/Ua5K Sk3pEhPxIoNvHZiQHFegEm69PPhftipTbCBVnQVI8KlwKMP0yb4rSYDu00gpgAq9Nm9P 4CNZGxh3bdDXFf8JAFxh9+2oyBR8KPA2D3OeWpVD92uBd70oBbHs8kN0bz9QaLqr6maA cm+oBy3DfrDGcjyhsmuyUcCvJZjioQkF9gPhJoxkAszbbGI4Y9321UNoFppBIWr4Nmsv VX+M6u2Upzx7I5apXnj/LSqbEL6TeDc43ZakT6bVFit//RUznhX1ps1nVDXOAqDCBJV4 hytA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712713321; x=1713318121; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dFTLhk0vdeXop5H6NbS6EGjp12U1dTTjdfWDU35lNWw=; b=Luw7G5jBvNKS5m75LODzHHgiGHTsDhQSbFpYre0uqi8XCfbgvAMkrDWVM7kJmzLMFl Uj6ikGHBvzFwKYP5wfwAZP1GKKkvdR7yTqqLnMiaf1rB4Shi69xnh2cSlqJkdcyRVjZQ blAGFTI+7jbQB0Pi6Gkcj5ePrfY4y2UNpEfq4meIGibNT6nqLLKeu2TlFGVYeru1xsaC KXxp3sRkjeWSFlnsthIR5QAOktyeOYLYtXj586yu/YkGTn8/ebD7PRBkqgwdmJbiyjSY +jNDcNAYMlAvXmruIyr9CdnpvUTWZsuGrf1MOPDg2tpFoRS0B5JTuwP0/8qkgIk2pOsn ENhg== X-Gm-Message-State: AOJu0YxtGyDmoa8Ug9IjxQ+8t5Pb7c5I9zmX5zlj5s0fx9pIS8qmVmrD BodpsbwyPy09w4AapZCLdBu9pjmhKbWz2EAEasc1BanGdSXz79zlE/rE3NQc X-Google-Smtp-Source: AGHT+IHCqeYcXm17oodEZrYMngcYXAJ96UnKMVRIgNdu4PMdYsxKqd6sbkCQVj1hBHN7jUs+L32+3g== X-Received: by 2002:a05:6830:1e41:b0:6ea:173c:d6a5 with SMTP id e1-20020a0568301e4100b006ea173cd6a5mr1671886otj.8.1712713320993; Tue, 09 Apr 2024 18:42:00 -0700 (PDT) Received: from gnu-cfl-3.localdomain ([172.56.169.48]) by smtp.gmail.com with ESMTPSA id p13-20020a634f4d000000b005f3d2592b5csm8848073pgl.47.2024.04.09.18.42.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 18:42:00 -0700 (PDT) Received: from gnu-cfl-3.. (localhost [IPv6:::1]) by gnu-cfl-3.localdomain (Postfix) with ESMTP id 44EBF74019D for ; Tue, 9 Apr 2024 18:41:59 -0700 (PDT) From: "H.J. Lu" To: binutils@sourceware.org Subject: [PATCH] elf: Fix a memory leak in _bfd_elf_add_dynamic_entry Date: Tue, 9 Apr 2024 18:41:59 -0700 Message-ID: <20240410014159.2780541-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3019.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_STOCKGEN,RCVD_IN_DNSWL_NONE,RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Normally, the section contents is allocated by bfd_alloc which is freed when the object is closed. But the .dynamic section contents is allocated by bfd_realloc, which should be freed by calling free. Add a dynamic field to elf_link_hash_table for the .dynamic section and free its contents in _bfd_elf_link_hash_table_free. * elf-bfd.h (elf_link_hash_table): Add dynamic. * elflink.c (_bfd_elf_link_create_dynamic_sections): Set the dynamic field in elf_link_hash_table. (_bfd_elf_add_dynamic_entry): Use hash_table->dynamic. (_bfd_elf_strip_zero_sized_dynamic_sections): Likewise. (bfd_elf_add_dt_needed_tag): Likewise. (elf_finalize_dynstr): Likewise. (_bfd_elf_link_hash_table_free): Free htab->dynamic->contents. (bfd_elf_final_link): Use htab->dynamic. * elfxx-x86.c (_bfd_x86_elf_finish_dynamic_sections): Use htab->elf.dynamic. --- bfd/elf-bfd.h | 1 + bfd/elflink.c | 16 ++++++++++------ bfd/elfxx-x86.c | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 85e66488955..ef5dcb55e72 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -757,6 +757,7 @@ struct elf_link_hash_table asection *irelifunc; asection *dynsym; asection *srelrdyn; + asection *dynamic; }; /* Returns TRUE if the hash table is a struct elf_link_hash_table. */ diff --git a/bfd/elflink.c b/bfd/elflink.c index c73470276cd..22fddb8f56b 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -355,6 +355,7 @@ _bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (s == NULL || !bfd_set_section_alignment (s, bed->s->log_file_align)) return false; + elf_hash_table (info)->dynamic = s; /* The special symbol _DYNAMIC is always set to the start of the .dynamic section. We could set _DYNAMIC in a linker script, but we @@ -3729,7 +3730,7 @@ _bfd_elf_add_dynamic_entry (struct bfd_link_info *info, hash_table->dynamic_relocs = true; bed = get_elf_backend_data (hash_table->dynobj); - s = bfd_get_linker_section (hash_table->dynobj, ".dynamic"); + s = hash_table->dynamic; BFD_ASSERT (s != NULL); newsize = s->size + bed->s->sizeof_dyn; @@ -3772,7 +3773,7 @@ _bfd_elf_strip_zero_sized_dynamic_sections (struct bfd_link_info *info) if (!hash_table->dynobj) return true; - sdynamic= bfd_get_linker_section (hash_table->dynobj, ".dynamic"); + sdynamic= hash_table->dynamic; if (!sdynamic) return true; @@ -3872,7 +3873,7 @@ bfd_elf_add_dt_needed_tag (bfd *abfd, struct bfd_link_info *info) bfd_byte *extdyn; bed = get_elf_backend_data (hash_table->dynobj); - sdyn = bfd_get_linker_section (hash_table->dynobj, ".dynamic"); + sdyn = hash_table->dynamic; if (sdyn != NULL && sdyn->size != 0) for (extdyn = sdyn->contents; extdyn < sdyn->contents + sdyn->size; @@ -4017,7 +4018,7 @@ elf_finalize_dynstr (bfd *output_bfd, struct bfd_link_info *info) info->callbacks->examine_strtab (dynstr); bed = get_elf_backend_data (dynobj); - sdyn = bfd_get_linker_section (dynobj, ".dynamic"); + sdyn = hash_table->dynamic; BFD_ASSERT (sdyn != NULL); /* Update all .dynamic entries referencing .dynstr strings. */ @@ -8352,6 +8353,9 @@ _bfd_elf_link_hash_table_free (bfd *obfd) if (htab->dynstr != NULL) _bfd_elf_strtab_free (htab->dynstr); _bfd_merge_sections_free (htab->merge_info); + /* NB: htab->dynamic->contents is always allocated by bfd_realloc. */ + if (htab->dynamic != NULL) + free (htab->dynamic->contents); if (htab->first_hash != NULL) { bfd_hash_table_free (htab->first_hash); @@ -13420,7 +13424,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) bfd_byte *dyncon, *dynconend; /* Fix up .dynamic entries. */ - o = bfd_get_linker_section (dynobj, ".dynamic"); + o = htab->dynamic; BFD_ASSERT (o != NULL); dyncon = o->contents; @@ -13654,7 +13658,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info) /* Check for DT_TEXTREL (late, in case the backend removes it). */ if (bfd_link_textrel_check (info) - && (o = bfd_get_linker_section (dynobj, ".dynamic")) != NULL + && (o = htab->dynamic) != NULL && o->size != 0) { bfd_byte *dyncon, *dynconend; diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c index 7d189bc66d1..725884e78c1 100644 --- a/bfd/elfxx-x86.c +++ b/bfd/elfxx-x86.c @@ -2715,7 +2715,7 @@ _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd, return htab; dynobj = htab->elf.dynobj; - sdyn = bfd_get_linker_section (dynobj, ".dynamic"); + sdyn = htab->elf.dynamic; /* GOT is always created in setup_gnu_properties. But it may not be needed. .got.plt section may be needed for static IFUNC. */ -- 2.44.0