From: Tom Tromey <tom@tromey.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [PATCH 1/2] Two bug fixes in mdict_free
Date: Thu, 23 Oct 2025 11:17:33 -0600 [thread overview]
Message-ID: <20251023-mdict-free-v1-1-ad02b2bdd549@tromey.com> (raw)
In-Reply-To: <20251023-mdict-free-v1-0-ad02b2bdd549@tromey.com>
A heap-allocated multidictionary should be freed by calling
mdict_free. However, while this function does free the contents of
the dictionary, it neglects to free the dictionary itself.
There's also a second bug, which is that if a multidictionary is
created with no dictionaries, gdb will crash on the first line of
mdict_free:
enum dict_type type = mdict->dictionaries[0]->vector->type;
So, this patch also adds the type to struct multidictionary, avoiding
this problem. Note that this does not increase the structure size on
x86-64, because the new member fits into the padding.
---
gdb/dictionary.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/gdb/dictionary.c b/gdb/dictionary.c
index f435ad5a47e817dc59087ac2ff5637415a9256d6..9dec7ccb2af5fad1e0cb62b92dc79e41e2fbbc15 100644
--- a/gdb/dictionary.c
+++ b/gdb/dictionary.c
@@ -911,6 +911,9 @@ struct multidictionary
/* The number of language dictionaries currently allocated.
Only used for expandable dictionaries. */
unsigned short n_allocated_dictionaries;
+
+ /* The type of dictionary. */
+ enum dict_type type;
};
/* A helper function to collate symbols on the pending list by language. */
@@ -948,6 +951,7 @@ mdict_create_hashed (struct obstack *obstack,
retval->dictionaries
= XOBNEWVEC (obstack, struct dictionary *, nsyms.size ());
retval->n_allocated_dictionaries = nsyms.size ();
+ retval->type = DICT_HASHED;
int idx = 0;
for (const auto &[language, symlist] : nsyms)
@@ -969,6 +973,7 @@ mdict_create_hashed_expandable (enum language language)
retval->n_allocated_dictionaries = 1;
retval->dictionaries = XNEW (struct dictionary *);
retval->dictionaries[0] = dict_create_hashed_expandable (language);
+ retval->type = DICT_HASHED_EXPANDABLE;
return retval;
}
@@ -988,6 +993,7 @@ mdict_create_linear (struct obstack *obstack,
retval->dictionaries
= XOBNEWVEC (obstack, struct dictionary *, nsyms.size ());
retval->n_allocated_dictionaries = nsyms.size ();
+ retval->type = DICT_LINEAR;
int idx = 0;
for (const auto &[language, symlist] : nsyms)
@@ -1009,6 +1015,7 @@ mdict_create_linear_expandable (enum language language)
retval->n_allocated_dictionaries = 1;
retval->dictionaries = XNEW (struct dictionary *);
retval->dictionaries[0] = dict_create_linear_expandable (language);
+ retval->type = DICT_LINEAR_EXPANDABLE;
return retval;
}
@@ -1018,15 +1025,12 @@ mdict_create_linear_expandable (enum language language)
void
mdict_free (struct multidictionary *mdict)
{
- /* Grab the type of dictionary being used. */
- enum dict_type type = mdict->dictionaries[0]->vector->type;
-
/* Loop over all dictionaries and free them. */
for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx)
dict_free (mdict->dictionaries[idx]);
/* Free the dictionary list, if needed. */
- switch (type)
+ switch (mdict->type)
{
case DICT_HASHED:
case DICT_LINEAR:
@@ -1036,6 +1040,7 @@ mdict_free (struct multidictionary *mdict)
case DICT_HASHED_EXPANDABLE:
case DICT_LINEAR_EXPANDABLE:
xfree (mdict->dictionaries);
+ xfree (mdict);
break;
}
}
--
2.49.0
next prev parent reply other threads:[~2025-10-23 17:20 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-23 17:17 [PATCH 0/2] Fix memory leak with .debug_types Tom Tromey
2025-10-23 17:17 ` Tom Tromey [this message]
2025-10-23 18:26 ` [PATCH 1/2] Two bug fixes in mdict_free Simon Marchi
2025-10-23 18:32 ` Simon Marchi
2025-10-23 18:49 ` Tom Tromey
2025-10-23 17:17 ` [PATCH 2/2] Free multidicts from blockvector Tom Tromey
2025-10-23 18:31 ` Simon Marchi
2025-10-23 18:52 ` Tom Tromey
2025-10-24 14:08 ` Tom Tromey
2025-10-24 16:25 ` Simon Marchi
2025-10-24 18:04 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251023-mdict-free-v1-1-ad02b2bdd549@tromey.com \
--to=tom@tromey.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox