From: Tom Tromey <tromey@adacore.com>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tromey@adacore.com>
Subject: [PATCH] Bounds check access to Ada task state names
Date: Wed, 16 Nov 2022 14:00:11 -0700 [thread overview]
Message-ID: <20221116210011.198094-1-tromey@adacore.com> (raw)
While looking into Ada tasking a little, I noticed that no bounds
checking is done on accesses to the Ada task state names arrays. This
isn't a problem currently, but if the runtime ever added numbers -- or
if there was some kind of runtime corruption -- it could cause a gdb
crash.
This patch adds range checking. It also adds a missing _() call when
printing from the 'task_states' array.
---
gdb/ada-tasks.c | 33 +++++++++++++++++++++++++++++++--
1 file changed, 31 insertions(+), 2 deletions(-)
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index 85d1aaccb06..fbf92041d94 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -85,6 +85,20 @@ static const char * const task_states[] = {
N_("Selective Wait")
};
+/* Return a string representing the task state. */
+static const char *
+get_state (unsigned value)
+{
+ if (value >= 0
+ && value <= ARRAY_SIZE (task_states)
+ && task_states[value][0] != '\0')
+ return _(task_states[value]);
+
+ static char buffer[100];
+ xsnprintf (buffer, sizeof (buffer), _("Unknown task state: %d"), value);
+ return buffer;
+}
+
/* A longer description corresponding to each possible task state. */
static const char * const long_task_states[] = {
N_("Unactivated"),
@@ -107,6 +121,21 @@ static const char * const long_task_states[] = {
N_("Blocked in selective wait statement")
};
+/* Return a string representing the task state. This uses the long
+ descriptions. */
+static const char *
+get_long_state (unsigned value)
+{
+ if (value >= 0
+ && value <= ARRAY_SIZE (long_task_states)
+ && long_task_states[value][0] != '\0')
+ return _(long_task_states[value]);
+
+ static char buffer[100];
+ xsnprintf (buffer, sizeof (buffer), _("Unknown task state: %d"), value);
+ return buffer;
+}
+
/* The index of certain important fields in the Ada Task Control Block
record and sub-records. */
@@ -1182,7 +1211,7 @@ print_ada_task_info (struct ui_out *uiout,
get_task_number_from_id (task_info->called_task,
inf));
else
- uiout->field_string ("state", task_states[task_info->state]);
+ uiout->field_string ("state", get_state (task_info->state));
/* Finally, print the task name, without quotes around it, as mi like
is not expecting quotes, and in non mi-like no need for quotes
@@ -1276,7 +1305,7 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
target_taskno);
}
else
- gdb_printf (_("State: %s"), _(long_task_states[task_info->state]));
+ gdb_printf (_("State: %s"), get_long_state (task_info->state));
if (target_taskno)
{
--
2.34.3
next reply other threads:[~2022-11-16 21:00 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-16 21:00 Tom Tromey [this message]
2022-11-30 15:45 ` 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=20221116210011.198094-1-tromey@adacore.com \
--to=tromey@adacore.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;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).