From 35cf52eb144de36e6745263a0e235e10b537b667 Mon Sep 17 00:00:00 2001 From: GustavoLCR Date: Mon, 18 Jul 2022 22:20:29 -0300 Subject: [PATCH] Fix double free of enum member name (#2817) --- librz/core/cmd/cmd_type.c | 3 +-- librz/include/rz_type.h | 2 +- librz/type/format.c | 2 +- librz/type/type.c | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/librz/core/cmd/cmd_type.c b/librz/core/cmd/cmd_type.c index 9fc8ac44a6..027daa7dcb 100644 --- a/librz/core/cmd/cmd_type.c +++ b/librz/core/cmd/cmd_type.c @@ -43,13 +43,12 @@ static void types_cc_print(RzCore *core, const char *cc, RzOutputMode mode) { static RzCmdStatus types_enum_member_find(RzCore *core, const char *enum_name, const char *enum_value) { rz_return_val_if_fail(enum_name || enum_value, RZ_CMD_STATUS_ERROR); ut64 value = rz_num_math(core->num, enum_value); - char *enum_member = rz_type_db_enum_member_by_val(core->analysis->typedb, enum_name, value); + const char *enum_member = rz_type_db_enum_member_by_val(core->analysis->typedb, enum_name, value); if (!enum_member) { RZ_LOG_ERROR("Cannot find matching enum member"); return RZ_CMD_STATUS_ERROR; } rz_cons_println(enum_member); - free(enum_member); return RZ_CMD_STATUS_OK; } diff --git a/librz/include/rz_type.h b/librz/include/rz_type.h index 7e6e8e316c..171e0803ac 100644 --- a/librz/include/rz_type.h +++ b/librz/include/rz_type.h @@ -334,7 +334,7 @@ RZ_API RzBaseType *rz_type_db_get_struct(const RzTypeDB *typedb, const char *nam RZ_API RzBaseType *rz_type_db_get_typedef(const RzTypeDB *typedb, RZ_NONNULL const char *name); RZ_API int rz_type_db_enum_member_by_name(const RzTypeDB *typedb, const char *name, const char *member); -RZ_API RZ_BORROW char *rz_type_db_enum_member_by_val(const RzTypeDB *typedb, const char *name, ut64 val); +RZ_API RZ_BORROW const char *rz_type_db_enum_member_by_val(const RzTypeDB *typedb, const char *name, ut64 val); RZ_API RZ_OWN RzList *rz_type_db_find_enums_by_val(const RzTypeDB *typedb, ut64 val); RZ_API char *rz_type_db_enum_get_bitfield(const RzTypeDB *typedb, const char *name, ut64 val); diff --git a/librz/type/format.c b/librz/type/format.c index 9e0d1bdd65..358bbe8339 100644 --- a/librz/type/format.c +++ b/librz/type/format.c @@ -1363,7 +1363,7 @@ static void rz_type_format_bitfield(const RzTypeDB *typedb, RzStrBuf *outbuf, ut static void rz_type_format_enum(const RzTypeDB *typedb, RzStrBuf *outbuf, ut64 seeki, char *fmtname, char *fieldname, ut64 addr, int mode, int size) { - char *enumvalue = NULL; + const char *enumvalue = NULL; addr &= (1ULL << (size * 8)) - 1; if (MUSTSEE && !SEEVALUE) { rz_strbuf_appendf(outbuf, "0x%08" PFMT64x " = ", seeki); diff --git a/librz/type/type.c b/librz/type/type.c index e90908e081..d248b55459 100644 --- a/librz/type/type.c +++ b/librz/type/type.c @@ -505,7 +505,7 @@ RZ_API RzBaseType *rz_type_db_get_enum(const RzTypeDB *typedb, RZ_NONNULL const * \param name The name of the enum to search in * \param val The value to search for */ -RZ_API RZ_BORROW char *rz_type_db_enum_member_by_val(const RzTypeDB *typedb, RZ_NONNULL const char *name, ut64 val) { +RZ_API RZ_BORROW const char *rz_type_db_enum_member_by_val(const RzTypeDB *typedb, RZ_NONNULL const char *name, ut64 val) { rz_return_val_if_fail(typedb && name, NULL); RzBaseType *btype = rz_type_db_get_base_type(typedb, name); if (!btype) {