diff options
author | Tom Tromey <tromey@adacore.com> | 2022-11-16 13:58:06 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-11-30 07:56:07 -0700 |
commit | f978da64412f37228bba9f79b3c68b7c6917379c (patch) | |
tree | 0f715357340928433e4c516bfd356e6fb9853dc8 /gdb/ada-tasks.c | |
parent | 016c606c66ce4b98c220130b9046545b04254a4a (diff) | |
download | fsf-binutils-gdb-f978da64412f37228bba9f79b3c68b7c6917379c.zip fsf-binutils-gdb-f978da64412f37228bba9f79b3c68b7c6917379c.tar.gz fsf-binutils-gdb-f978da64412f37228bba9f79b3c68b7c6917379c.tar.bz2 |
Bounds check access to Ada task state names
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.
Diffstat (limited to 'gdb/ada-tasks.c')
-rw-r--r-- | gdb/ada-tasks.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 85d1aac..fbf9204 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) { |