Skip to content

Commit 01f0c89

Browse files
author
Pavel S. Smirnov
committed
FIX(src/server/gdb_server.c): infinite loop in gdb_generate_reg_type_description for REG_TYPE_CLASS_STRUCT
1 parent c99f56a commit 01f0c89

File tree

1 file changed

+96
-81
lines changed

1 file changed

+96
-81
lines changed

src/server/gdb_server.c

Lines changed: 96 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -2011,131 +2011,146 @@ static int lookup_add_arch_defined_types(char const **arch_defined_types_list[],
20112011
}
20122012

20132013
static int gdb_generate_reg_type_description(struct target *target,
2014-
char **tdesc, int *pos, int *size, struct reg_data_type *type,
2015-
char const **arch_defined_types_list[], int * num_arch_defined_types)
2014+
char **tdesc, int *pos, int *const size, struct reg_data_type *const type,
2015+
char const **arch_defined_types_list[], int *const num_arch_defined_types)
20162016
{
20172017
int retval = ERROR_OK;
20182018

2019-
if (type->type_class == REG_TYPE_CLASS_VECTOR) {
2020-
struct reg_data_type *data_type = type->reg_type_vector->type;
2021-
if (data_type->type == REG_TYPE_ARCH_DEFINED) {
2022-
if (lookup_add_arch_defined_types(arch_defined_types_list, data_type->id,
2023-
num_arch_defined_types))
2024-
gdb_generate_reg_type_description(target, tdesc, pos, size, data_type,
2025-
arch_defined_types_list,
2026-
num_arch_defined_types);
2027-
}
2028-
/* <vector id="id" type="type" count="count"/> */
2029-
xml_printf(&retval, tdesc, pos, size,
2030-
"<vector id=\"%s\" type=\"%s\" count=\"%d\"/>\n",
2031-
type->id, type->reg_type_vector->type->id,
2032-
type->reg_type_vector->count);
2033-
2034-
} else if (type->type_class == REG_TYPE_CLASS_UNION) {
2035-
struct reg_data_type_union_field *field;
2036-
field = type->reg_type_union->fields;
2037-
while (field != NULL) {
2038-
struct reg_data_type *data_type = field->type;
2019+
switch (type->type_class) {
2020+
case REG_TYPE_CLASS_VECTOR:
2021+
{
2022+
struct reg_data_type *data_type = type->reg_type_vector->type;
20392023
if (data_type->type == REG_TYPE_ARCH_DEFINED) {
20402024
if (lookup_add_arch_defined_types(arch_defined_types_list, data_type->id,
2041-
num_arch_defined_types))
2025+
num_arch_defined_types))
20422026
gdb_generate_reg_type_description(target, tdesc, pos, size, data_type,
2043-
arch_defined_types_list,
2044-
num_arch_defined_types);
2027+
arch_defined_types_list,
2028+
num_arch_defined_types);
20452029
}
2030+
/* <vector id="id" type="type" count="count"/> */
2031+
xml_printf(&retval, tdesc, pos, size,
2032+
"<vector id=\"%s\" type=\"%s\" count=\"%d\"/>\n",
2033+
type->id, type->reg_type_vector->type->id,
2034+
type->reg_type_vector->count);
20462035

2047-
field = field->next;
20482036
}
2049-
/* <union id="id">
2050-
* <field name="name" type="type"/> ...
2051-
* </union> */
2052-
xml_printf(&retval, tdesc, pos, size,
2037+
break;
2038+
2039+
case REG_TYPE_CLASS_UNION:
2040+
{
2041+
struct reg_data_type_union_field *field;
2042+
field = type->reg_type_union->fields;
2043+
while (field != NULL) {
2044+
struct reg_data_type *data_type = field->type;
2045+
if (data_type->type == REG_TYPE_ARCH_DEFINED) {
2046+
if (lookup_add_arch_defined_types(arch_defined_types_list, data_type->id,
2047+
num_arch_defined_types))
2048+
gdb_generate_reg_type_description(target, tdesc, pos, size, data_type,
2049+
arch_defined_types_list,
2050+
num_arch_defined_types);
2051+
}
2052+
2053+
field = field->next;
2054+
}
2055+
/* <union id="id">
2056+
* <field name="name" type="type"/> ...
2057+
* </union> */
2058+
xml_printf(&retval, tdesc, pos, size,
20532059
"<union id=\"%s\">\n",
20542060
type->id);
20552061

2056-
field = type->reg_type_union->fields;
2057-
while (field != NULL) {
2058-
xml_printf(&retval, tdesc, pos, size,
2062+
field = type->reg_type_union->fields;
2063+
while (field != NULL) {
2064+
xml_printf(&retval, tdesc, pos, size,
20592065
"<field name=\"%s\" type=\"%s\"/>\n",
20602066
field->name, field->type->id);
20612067

2062-
field = field->next;
2063-
}
2068+
field = field->next;
2069+
}
20642070

2065-
xml_printf(&retval, tdesc, pos, size,
2071+
xml_printf(&retval, tdesc, pos, size,
20662072
"</union>\n");
20672073

2068-
} else if (type->type_class == REG_TYPE_CLASS_STRUCT) {
2069-
struct reg_data_type_struct_field *field;
2070-
field = type->reg_type_struct->fields;
2074+
}
2075+
break;
20712076

2072-
if (field->use_bitfields) {
2073-
/* <struct id="id" size="size">
2074-
* <field name="name" start="start" end="end"/> ...
2075-
* </struct> */
2076-
xml_printf(&retval, tdesc, pos, size,
2077+
case REG_TYPE_CLASS_STRUCT:
2078+
{
2079+
struct reg_data_type_struct_field *field = type->reg_type_struct->fields;
2080+
2081+
if (field->use_bitfields) {
2082+
/* <struct id="id" size="size">
2083+
* <field name="name" start="start" end="end"/> ...
2084+
* </struct> */
2085+
xml_printf(&retval, tdesc, pos, size,
20772086
"<struct id=\"%s\" size=\"%d\">\n",
20782087
type->id, type->reg_type_struct->size);
2079-
while (field != NULL) {
2080-
xml_printf(&retval, tdesc, pos, size,
2088+
for (; field; field = field->next) {
2089+
xml_printf(&retval, tdesc, pos, size,
20812090
"<field name=\"%s\" start=\"%d\" end=\"%d\" type=\"%s\" />\n",
20822091
field->name, field->bitfield->start, field->bitfield->end,
20832092
gdb_get_reg_type_name(field->bitfield->type));
2084-
2085-
field = field->next;
2086-
}
2087-
} else {
2088-
while (field != NULL) {
2089-
struct reg_data_type *data_type = field->type;
2090-
if (data_type->type == REG_TYPE_ARCH_DEFINED) {
2091-
if (lookup_add_arch_defined_types(arch_defined_types_list, data_type->id,
2092-
num_arch_defined_types))
2093-
gdb_generate_reg_type_description(target, tdesc, pos, size, data_type,
2094-
arch_defined_types_list,
2095-
num_arch_defined_types);
20962093
}
2097-
}
2094+
} else {
2095+
for (struct reg_data_type_struct_field *tmp_field = field; tmp_field != NULL; tmp_field = tmp_field->next) {
2096+
struct reg_data_type *data_type = tmp_field->type;
2097+
if (data_type && data_type->type == REG_TYPE_ARCH_DEFINED) {
2098+
if (lookup_add_arch_defined_types(arch_defined_types_list, data_type->id,
2099+
num_arch_defined_types))
2100+
gdb_generate_reg_type_description(target, tdesc, pos, size, data_type,
2101+
arch_defined_types_list,
2102+
num_arch_defined_types);
2103+
}
2104+
}
20982105

2099-
/* <struct id="id">
2100-
* <field name="name" type="type"/> ...
2101-
* </struct> */
2102-
xml_printf(&retval, tdesc, pos, size,
2106+
/* <struct id="id">
2107+
* <field name="name" type="type"/> ...
2108+
* </struct> */
2109+
xml_printf(&retval, tdesc, pos, size,
21032110
"<struct id=\"%s\">\n",
21042111
type->id);
2105-
while (field != NULL) {
2106-
xml_printf(&retval, tdesc, pos, size,
2112+
for (; field; field = field->next) {
2113+
xml_printf(&retval, tdesc, pos, size,
21072114
"<field name=\"%s\" type=\"%s\"/>\n",
21082115
field->name, field->type->id);
2109-
2110-
field = field->next;
2116+
}
21112117
}
2112-
}
21132118

2114-
xml_printf(&retval, tdesc, pos, size,
2119+
xml_printf(&retval, tdesc, pos, size,
21152120
"</struct>\n");
21162121

2117-
} else if (type->type_class == REG_TYPE_CLASS_FLAGS) {
2118-
/* <flags id="id" size="size">
2119-
* <field name="name" start="start" end="end"/> ...
2120-
* </flags> */
2121-
xml_printf(&retval, tdesc, pos, size,
2122+
}
2123+
break;
2124+
2125+
case REG_TYPE_CLASS_FLAGS:
2126+
{
2127+
/* <flags id="id" size="size">
2128+
* <field name="name" start="start" end="end"/> ...
2129+
* </flags> */
2130+
xml_printf(&retval, tdesc, pos, size,
21222131
"<flags id=\"%s\" size=\"%d\">\n",
21232132
type->id, type->reg_type_flags->size);
21242133

2125-
struct reg_data_type_flags_field *field;
2126-
field = type->reg_type_flags->fields;
2127-
while (field != NULL) {
2128-
xml_printf(&retval, tdesc, pos, size,
2134+
struct reg_data_type_flags_field *field;
2135+
field = type->reg_type_flags->fields;
2136+
while (field != NULL) {
2137+
xml_printf(&retval, tdesc, pos, size,
21292138
"<field name=\"%s\" start=\"%d\" end=\"%d\" type=\"%s\" />\n",
21302139
field->name, field->bitfield->start, field->bitfield->end,
21312140
gdb_get_reg_type_name(field->bitfield->type));
21322141

2133-
field = field->next;
2134-
}
2142+
field = field->next;
2143+
}
21352144

2136-
xml_printf(&retval, tdesc, pos, size,
2145+
xml_printf(&retval, tdesc, pos, size,
21372146
"</flags>\n");
21382147

2148+
}
2149+
break;
2150+
2151+
default:
2152+
return ERROR_FAIL;
2153+
break;
21392154
}
21402155

21412156
return ERROR_OK;

0 commit comments

Comments
 (0)