librz/type: fix parsing and pretty-printing memory leaks (#6441)

Co-authored-by: Anton Kochkov <anton.kochkov@gmail.com>
This commit is contained in:
NOT XVilka 2026-05-31 15:39:18 +08:00 committed by GitHub
parent 7e42c9a4d7
commit af5ddda795
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 5 deletions

View file

@ -14,7 +14,9 @@ static void pdb_types_print_standard(const RzTypeDB *db, const RzPdb *pdb, const
RzBaseType *type;
RzStrBuf *buf = rz_strbuf_new(NULL);
rz_list_foreach (types, it, type) {
rz_strbuf_append(buf, rz_type_db_base_type_as_pretty_string(db, type, RZ_TYPE_PRINT_MULTILINE | RZ_TYPE_PRINT_END_NEWLINE, 1));
char *pretty = rz_type_db_base_type_as_pretty_string(db, type, RZ_TYPE_PRINT_MULTILINE | RZ_TYPE_PRINT_END_NEWLINE, 1);
rz_strbuf_append(buf, pretty);
free(pretty);
}
rz_cons_print(rz_strbuf_get(buf));
rz_strbuf_free(buf);

View file

@ -321,7 +321,9 @@ RZ_API RZ_OWN char *rz_type_db_base_type_as_pretty_string(RZ_NONNULL const RzTyp
rz_return_val_if_fail(typedb && btype, NULL);
RzType *type = rz_type_identifier_of_base_type(typedb, btype, false);
return rz_type_as_pretty_string(typedb, type, NULL, opts, unfold_level);
char *ret = rz_type_as_pretty_string(typedb, type, NULL, opts, unfold_level);
rz_type_free(type);
return ret;
}
/**

View file

@ -539,8 +539,9 @@ int parse_struct_node(CParserState *state, TSNode node, const char *text, Parser
result = -1;
goto srnexit;
}
const char *bits_str = ts_node_sub_string(field_bits, text);
char *bits_str = ts_node_sub_string(field_bits, text);
int bits = rz_num_get(NULL, bits_str);
free(bits_str);
parser_debug(state, "field type: %s field_identifier: %s bits: %d\n", real_type, real_identifier, bits);
// Then we augment resulting type field with the data from parsed declarator
char *membname = NULL;
@ -593,7 +594,9 @@ int parse_struct_node(CParserState *state, TSNode node, const char *text, Parser
}
parser_debug(state, "Appended member \"%s\" into struct \"%s\"\n", membname, name);
} else {
parser_debug(state, "Struct field wrong: \"%s\"\n", ts_node_sub_string(field_declarator, text));
char *wrong = ts_node_sub_string(field_declarator, text);
parser_debug(state, "Struct field wrong: \"%s\"\n", wrong);
free(wrong);
}
field_declarator = ts_node_next_named_sibling(field_declarator);
} while (!ts_node_is_null(field_declarator));
@ -832,8 +835,9 @@ int parse_union_node(CParserState *state, TSNode node, const char *text, ParserT
result = -1;
goto urnexit;
}
const char *bits_str = ts_node_sub_string(field_bits, text);
char *bits_str = ts_node_sub_string(field_bits, text);
int bits = rz_num_get(NULL, bits_str);
free(bits_str);
parser_debug(state, "field type: %s field_identifier: %s bits: %d\n", real_type, real_identifier, bits);
// Then we augment resulting type field with the data from parsed declarator
char *membname = NULL;