mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-25 21:41:47 +08:00
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.
This commit is contained in:
@ -85,6 +85,20 @@ static const char * const task_states[] = {
|
|||||||
N_("Selective Wait")
|
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. */
|
/* A longer description corresponding to each possible task state. */
|
||||||
static const char * const long_task_states[] = {
|
static const char * const long_task_states[] = {
|
||||||
N_("Unactivated"),
|
N_("Unactivated"),
|
||||||
@ -107,6 +121,21 @@ static const char * const long_task_states[] = {
|
|||||||
N_("Blocked in selective wait statement")
|
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
|
/* The index of certain important fields in the Ada Task Control Block
|
||||||
record and sub-records. */
|
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,
|
get_task_number_from_id (task_info->called_task,
|
||||||
inf));
|
inf));
|
||||||
else
|
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
|
/* 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
|
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);
|
target_taskno);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gdb_printf (_("State: %s"), _(long_task_states[task_info->state]));
|
gdb_printf (_("State: %s"), get_long_state (task_info->state));
|
||||||
|
|
||||||
if (target_taskno)
|
if (target_taskno)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user