[PATCH v1 3/7] bfd: fix memory leak when assigning the merge result of OAv2 string attributes
Jan Beulich
jbeulich@suse.com
Thu Feb 5 15:38:03 GMT 2026
On 05.02.2026 16:17, Matthieu Longo wrote:
> On 05/02/2026 10:46, Jan Beulich wrote:
>> On 03.02.2026 11:00, Matthieu Longo wrote:
>>> --- a/bfd/elf-attrs.c
>>> +++ b/bfd/elf-attrs.c
>>> @@ -1467,6 +1467,19 @@ oav2_search_by_tag (obj_attr_v2_t *attr_first, obj_attr_tag_t tag)
>>> return NULL;
>>> }
>>>
>>> +/* Assign the merge result to REF.
>>> + The only reason to exist for this helper is when the manipulated value is a
>>> + string. In this case, the value in REF must be freed before assigning. */
>>> +static void
>>> +oav2_attr_assign_merge_result (obj_attr_encoding_v2_t encoding,
>>
>> The "attr" in the name looks to be redundant with the 'a' in "oav2". Is there a
>> particular reason for this?
>>
>>> + obj_attr_v2_t *a_ref,
>>> + obj_attr_v2_merge_result_t *res)
>>
>> As before - pointer-to-const please wherever sensible and possible.
>>
>> Okay with respective adjustments or (for the former remark) clarification.
>>
>> Jan
>
> Here is the modified version addressing your comments, and taking into account the future usage in the next patch.
> Changes:
> - renaming to oav2_assign_value
> - change 3rd parameter type from "obj_attr_v2_merge_result_t *" to "union obj_attr_value_v2", so no need of const anymore.
> - Use (void *) for the cast before passing the value to free ().
LGTM, thanks.
Jan
> diff --git a/bfd/elf-attrs.c b/bfd/elf-attrs.c
> index 6c3cfc09677..e0847a04aec 100644
> --- a/bfd/elf-attrs.c
> +++ b/bfd/elf-attrs.c
> @@ -1061,6 +1061,19 @@ oav2_subsections_mark_unknown (const bfd *abfd)
> }
> }
>
> +/* Assign the merge result to REF.
> + The only reason to exist for this helper is when the manipulated value is a
> + string. In this case, the value in REF must be freed before assigning. */
> +static void
> +oav2_assign_value (obj_attr_encoding_v2_t encoding,
> + obj_attr_v2_t *a_ref,
> + union obj_attr_value_v2 res)
> +{
> + if (encoding == OA_ENC_NTBS)
> + free ((void *) a_ref->val.string);
> + a_ref->val = res;
> +}
> +
> /* Initialize the given ATTR with its default value coming from the known tag
> registry. */
> static void
> @@ -1505,7 +1518,7 @@ handle_optional_subsection_merge (const struct bfd_link_info *info,
> frozen_is_abfd);
> _bfd_elf_obj_attr_v2_free (a_default, s_ref->encoding);
> if (res.merge)
> - a_ref->val = res.val;
> + oav2_assign_value (s_ref->encoding, a_ref, res.val);
> else if (res.reason == OAv2_MERGE_UNSUPPORTED)
> a_ref->status = obj_attr_v2_unknown;
> a_ref = a_ref->next;
> @@ -1518,7 +1531,7 @@ handle_optional_subsection_merge (const struct bfd_link_info *info,
> frozen_is_abfd);
> if (res.merge || res.reason == OAv2_MERGE_SAME_VALUE_AS_REF)
> {
> - a_default->val = res.val;
> + oav2_assign_value (s_ref->encoding, a_default, res.val);
> LINKED_LIST_INSERT_BEFORE (obj_attr_v2_t)
> (s_ref, a_default, a_ref);
> }
> @@ -1532,7 +1545,7 @@ handle_optional_subsection_merge (const struct bfd_link_info *info,
> = oav2_attr_merge (info, abfd, s_ref, a_ref, a_abfd, a_frozen,
> frozen_is_abfd);
> if (res.merge)
> - a_ref->val = res.val;
> + oav2_assign_value (s_ref->encoding, a_ref, res.val);
> else if (res.reason == OAv2_MERGE_UNSUPPORTED)
> a_ref->status = obj_attr_v2_unknown;
> a_ref = a_ref->next;
> @@ -1547,7 +1560,7 @@ handle_optional_subsection_merge (const struct bfd_link_info *info,
> = oav2_attr_merge (info, abfd, s_ref, a_default, a_abfd, NULL, false);
> if (res.merge || res.reason == OAv2_MERGE_SAME_VALUE_AS_REF)
> {
> - a_default->val = res.val;
> + oav2_assign_value (s_ref->encoding, a_default, res.val);
> LINKED_LIST_APPEND (obj_attr_v2_t) (s_ref, a_default);
> }
> else
> @@ -1566,7 +1579,7 @@ handle_optional_subsection_merge (const struct bfd_link_info *info,
> frozen_is_abfd);
> _bfd_elf_obj_attr_v2_free (a_default, s_ref->encoding);
> if (res.merge)
> - a_ref->val = res.val;
> + oav2_assign_value (s_ref->encoding, a_ref, res.val);
> else if (res.reason == OAv2_MERGE_UNSUPPORTED)
> a_ref->status = obj_attr_v2_unknown;
> }
More information about the Binutils
mailing list