diff --git a/librz/core/cbin.c b/librz/core/cbin.c index b232dc3e540..5a97ff580e1 100644 --- a/librz/core/cbin.c +++ b/librz/core/cbin.c @@ -1527,7 +1527,7 @@ RZ_API bool rz_core_bin_apply_symbols(RzCore *core, RzBinFile *binfile, bool va) } if (fi) { rz_flag_item_set_realname(fi, sn.methname); - if ((fi->offset - core->flags->base) == addr) { + if (fi->offset == addr) { rz_flag_unset(core->flags, fi); } } else { diff --git a/librz/core/project_migrate.c b/librz/core/project_migrate.c index 847f4aa3024..553930004cd 100644 --- a/librz/core/project_migrate.c +++ b/librz/core/project_migrate.c @@ -610,7 +610,7 @@ RZ_API bool rz_project_migrate_v14_v15(RzProject *prj, RzSerializeResultInfo *re // -- // Migration 15 -> 16 // -// Changes from : +// Changes from f9422ac0cd6922f73208e5f5e6f47b3d64b3bd0d: // Removed options: // - `bin.maxstr` // Renamed options: @@ -631,6 +631,21 @@ RZ_API bool rz_project_migrate_v15_v16(RzProject *prj, RzSerializeResultInfo *re return true; } +// -- +// Migration 16 -> 17 +// +// Changes from : +// Removed /core/flags/base key (RzFlag.base) + +RZ_API bool rz_project_migrate_v16_v17(RzProject *prj, RzSerializeResultInfo *res) { + Sdb *core_db; + RZ_SERIALIZE_SUB(prj, core_db, res, "core", return false;); + Sdb *flags_db; + RZ_SERIALIZE_SUB(core_db, flags_db, res, "flags", return false;); + sdb_unset(flags_db, "base", 0); + return true; +} + static bool (*const migrations[])(RzProject *prj, RzSerializeResultInfo *res) = { rz_project_migrate_v1_v2, rz_project_migrate_v2_v3, @@ -647,6 +662,7 @@ static bool (*const migrations[])(RzProject *prj, RzSerializeResultInfo *res) = rz_project_migrate_v13_v14, rz_project_migrate_v14_v15, rz_project_migrate_v15_v16, + rz_project_migrate_v16_v17 }; /// Migrate the given project to the current version in-place diff --git a/librz/flag/flag.c b/librz/flag/flag.c index b253a341418..35ee385c090 100644 --- a/librz/flag/flag.c +++ b/librz/flag/flag.c @@ -227,7 +227,6 @@ RZ_API RzFlag *rz_flag_new(void) { rz_flag_free(f); return NULL; } - f->base = 0; f->zones = NULL; f->tags = sdb_new0(); f->ht_name = ht_pp_new(NULL, ht_free_flag, NULL); @@ -660,7 +659,7 @@ RZ_API RzFlagItem *rz_flag_set(RzFlag *f, const char *name, ut64 off, ut32 size) item->space = rz_flag_space_cur(f); item->size = size; - update_flag_item_offset(f, item, off + f->base, is_new, true); + update_flag_item_offset(f, item, off, is_new, true); update_flag_item_name(f, item, name, true); return item; err: diff --git a/librz/flag/serialize_flag.c b/librz/flag/serialize_flag.c index a2aee29c49f..fce4d7b9ea8 100644 --- a/librz/flag/serialize_flag.c +++ b/librz/flag/serialize_flag.c @@ -8,7 +8,6 @@ * SDB Format: * * / - * base= * realnames= * /spaces * see spaces.c @@ -18,7 +17,6 @@ * ={"from":,"to":} * /flags * ={"realname":,"demangled":,"offset":,"size":,"space":,"color":,"comment":,"alias":} - * */ RZ_API void rz_serialize_flag_zones_save(RZ_NONNULL Sdb *db, RZ_NONNULL RzList /**/ *zones) { @@ -122,11 +120,6 @@ static bool flag_save_cb(RzFlagItem *flag, void *user) { RZ_API void rz_serialize_flag_save(RZ_NONNULL Sdb *db, RZ_NONNULL RzFlag *flag) { rz_serialize_spaces_save(sdb_ns(db, "spaces", true), &flag->spaces); - char buf[32]; - if (snprintf(buf, sizeof(buf), "%" PFMT64d, flag->base) < 0) { - return; - } - sdb_set(db, "base", buf, 0); sdb_set(db, "realnames", flag->realnames ? "1" : "0", 0); sdb_copy(flag->tags, sdb_ns(db, "tags", true)); rz_serialize_flag_zones_save(sdb_ns(db, "zones", true), flag->zones); @@ -227,7 +220,7 @@ static bool flag_load_cb(void *user, const char *k, const char *v) { goto beach; } - RzFlagItem *item = rz_flag_set(ctx->flag, k, proto.offset - ctx->flag->base, proto.size); + RzFlagItem *item = rz_flag_set(ctx->flag, k, proto.offset, proto.size); if (proto.realname) { rz_flag_item_set_realname(item, proto.realname); } @@ -270,14 +263,7 @@ static bool load_flags(RZ_NONNULL Sdb *flags_db, RZ_NONNULL RzFlag *flag) { RZ_API bool rz_serialize_flag_load(RZ_NONNULL Sdb *db, RZ_NONNULL RzFlag *flag, RZ_NULLABLE RzSerializeResultInfo *res) { rz_flag_unset_all(flag); - const char *str = sdb_const_get(db, "base", NULL); - if (!str) { - RZ_SERIALIZE_ERR(res, "flag base key is missing"); - return false; - } - flag->base = strtoll(str, NULL, 0); - - str = sdb_const_get(db, "realnames", 0); + const char *str = sdb_const_get(db, "realnames", 0); if (!str) { RZ_SERIALIZE_ERR(res, "flag realnames key is missing"); return false; diff --git a/librz/include/rz_flag.h b/librz/include/rz_flag.h index 847a4c317d0..bd8e47f32c7 100644 --- a/librz/include/rz_flag.h +++ b/librz/include/rz_flag.h @@ -45,7 +45,6 @@ typedef struct rz_flag_item_t { typedef struct rz_flag_t { RzSpaces spaces; /* handle flag spaces */ - st64 base; /* base address for all flag items */ bool realnames; Sdb *tags; RzNum *num; diff --git a/librz/include/rz_project.h b/librz/include/rz_project.h index c75d70e8520..b5d02cd6167 100644 --- a/librz/include/rz_project.h +++ b/librz/include/rz_project.h @@ -12,7 +12,7 @@ extern "C" { #endif -#define RZ_PROJECT_VERSION 16 +#define RZ_PROJECT_VERSION 17 typedef Sdb RzProject; @@ -61,6 +61,7 @@ RZ_API bool rz_project_migrate_v12_v13(RzProject *prj, RzSerializeResultInfo *re RZ_API bool rz_project_migrate_v13_v14(RzProject *prj, RzSerializeResultInfo *res); RZ_API bool rz_project_migrate_v14_v15(RzProject *prj, RzSerializeResultInfo *res); RZ_API bool rz_project_migrate_v15_v16(RzProject *prj, RzSerializeResultInfo *res); +RZ_API bool rz_project_migrate_v16_v17(RzProject *prj, RzSerializeResultInfo *res); RZ_API bool rz_project_migrate(RzProject *prj, unsigned long version, RzSerializeResultInfo *res); #ifdef __cplusplus diff --git a/test/db/cmd/project b/test/db/cmd/project index b43d52a2086..8ffef6e5ddb 100644 --- a/test/db/cmd/project +++ b/test/db/cmd/project @@ -374,6 +374,7 @@ Detailed project load info: project migrated from version 13 to 14. project migrated from version 14 to 15. project migrated from version 15 to 16. + project migrated from version 16 to 17. EOF RUN diff --git a/test/integration/test_project_migrate.c b/test/integration/test_project_migrate.c index 3ef826c6742..d2ca7018e7d 100644 --- a/test/integration/test_project_migrate.c +++ b/test/integration/test_project_migrate.c @@ -574,6 +574,22 @@ static bool test_migrate_v15_v16_str_config() { mu_end; } +static bool test_migrate_v16_v17_flags_base() { + RzProject *prj = rz_project_load_file_raw("prj/v16-flags-base.rzdb"); + mu_assert_notnull(prj, "load raw project"); + RzSerializeResultInfo *res = rz_serialize_result_info_new(); + bool s = rz_project_migrate_v16_v17(prj, res); + mu_assert_true(s, "migrate success"); + Sdb *core_db = sdb_ns(prj, "core", false); + mu_assert_notnull(core_db, "core ns"); + Sdb *config_db = sdb_ns(core_db, "flags", false); + mu_assert_notnull(config_db, "config ns"); + mu_assert_null(sdb_get(config_db, "base", 0), "flags base"); + rz_serialize_result_info_free(res); + rz_project_free(prj); + mu_end; +} + /// Load project of given version from file into core and check the log for migration success messages #define BEGIN_LOAD_TEST(core, version, file) \ @@ -954,6 +970,14 @@ static bool test_load_v15_str_config() { mu_end; } +static bool test_load_v16() { + RzCore *core = rz_core_new(); + BEGIN_LOAD_TEST(core, 16, "prj/v16-flags-base.rzdb"); + // No new or changed info here + rz_core_free(core); + mu_end; +} + int all_tests() { mu_run_test(test_migrate_v1_v2_noreturn); mu_run_test(test_migrate_v1_v2_noreturn_empty); @@ -973,6 +997,7 @@ int all_tests() { mu_run_test(test_migrate_v2_v12); mu_run_test(test_migrate_v14_v15); mu_run_test(test_migrate_v15_v16_str_config); + mu_run_test(test_migrate_v16_v17_flags_base); mu_run_test(test_load_v1_noreturn); mu_run_test(test_load_v1_noreturn_empty); mu_run_test(test_load_v1_unknown_type); @@ -994,6 +1019,7 @@ int all_tests() { mu_run_test(test_load_v14); mu_run_test(test_load_v15_seek_history); mu_run_test(test_load_v15_str_config); + mu_run_test(test_load_v16); return tests_passed != tests_run; } diff --git a/test/prj/v16-flags-base.rzdb b/test/prj/v16-flags-base.rzdb new file mode 100644 index 00000000000..250a9a3de9b --- /dev/null +++ b/test/prj/v16-flags-base.rzdb @@ -0,0 +1,76 @@ +/ +type=rizin rz-db project +version=16 + +/core +blocksize=0x100 +offset=0x5ae0 + +/core/analysis + +/core/analysis/blocks + +/core/analysis/callables + +/core/analysis/cc + +/core/analysis/classes + +/core/analysis/classes/attrs + +/core/analysis/functions + +/core/analysis/hints + +/core/analysis/imports + +/core/analysis/meta + +/core/analysis/meta/spaces +name=CS +spacestack=["*"] + +/core/analysis/meta/spaces/spaces +bin=s + +/core/analysis/noreturn + +/core/analysis/types + +/core/analysis/vars + +/core/analysis/xrefs + +/core/config + +/core/debug + +/core/debug/breakpoints + +/core/file +relative=../bins/elf/ls + +/core/flags +base=100 +realnames=1 + +/core/flags/flags + +/core/flags/spaces +name=fs +spacestack=["*"] + +/core/flags/spaces/spaces +classes=s +relocs=s +sections=s +segments=s +strings=s +symbols=s + +/core/flags/tags + +/core/flags/zones + +/core/seek +0={"offset":23264,"cursor":0,"current":true} diff --git a/test/unit/test_serialize_flag.c b/test/unit/test_serialize_flag.c index 3b0d7fa0db7..9f4598e6a83 100644 --- a/test/unit/test_serialize_flag.c +++ b/test/unit/test_serialize_flag.c @@ -8,7 +8,6 @@ Sdb *ref_0_db() { Sdb *db = sdb_new0(); - sdb_set(db, "base", "-1337", 0); sdb_set(db, "realnames", "1", 0); Sdb *spaces_db = sdb_ns(db, "spaces", true); @@ -27,9 +26,9 @@ Sdb *ref_0_db() { sdb_set(zones_db, PERTURBATOR, "{\"from\":3735928559,\"to\":18446744073709551614}", 0); Sdb *flags_db = sdb_ns(db, "flags", true); - sdb_set(flags_db, "foobars", "{\"realname\":\"Foobars\",\"demangled\":true,\"offset\":3582,\"size\":16,\"space\":\"reveries\",\"color\":\"white\",\"comment\":\"windowpane\",\"alias\":\"f00b4r5\"}", 0); - sdb_set(flags_db, "f00b4r5", "{\"realname\":\"f00b4r5\",\"demangled\":false,\"offset\":3582,\"size\":1}", 0); - sdb_set(flags_db, "deliverance", "{\"realname\":\"deliverance\",\"demangled\":false,\"offset\":66,\"size\":19}", 0); + sdb_set(flags_db, "foobars", "{\"realname\":\"Foobars\",\"demangled\":true,\"offset\":4919,\"size\":16,\"space\":\"reveries\",\"color\":\"white\",\"comment\":\"windowpane\",\"alias\":\"f00b4r5\"}", 0); + sdb_set(flags_db, "f00b4r5", "{\"realname\":\"f00b4r5\",\"demangled\":false,\"offset\":4919,\"size\":1}", 0); + sdb_set(flags_db, "deliverance", "{\"realname\":\"deliverance\",\"demangled\":false,\"offset\":1403,\"size\":19}", 0); return db; } @@ -37,7 +36,6 @@ Sdb *ref_0_db() { RzFlag *ref_0_flag() { RzFlag *flag = rz_flag_new(); - flag->base = -1337; flag->realnames = true; rz_flag_set(flag, "deliverance", 0x42 + 1337, 0x13); @@ -67,7 +65,6 @@ RzFlag *ref_0_flag() { Sdb *ref_1_db() { Sdb *db = sdb_new0(); - sdb_set(db, "base", "0", 0); sdb_set(db, "realnames", "0", 0); Sdb *spaces_db = sdb_ns(db, "spaces", true); @@ -83,7 +80,6 @@ Sdb *ref_1_db() { RzFlag *ref_1_flag() { RzFlag *flag = rz_flag_new(); - flag->base = 0; flag->realnames = false; return flag; } @@ -204,7 +200,6 @@ static bool test_load(Sdb *db, RzFlag *ref) { continue; } - mu_assert_eq_fmt(flag->base, ref->base, "base", "0x%" PFMT64x); mu_assert_eq(flag->realnames, ref->realnames, "realnames"); assert_sdb_eq(flag->tags, ref->tags, "tags"); @@ -238,4 +233,4 @@ int all_tests() { return tests_passed != tests_run; } -mu_main(all_tests) \ No newline at end of file +mu_main(all_tests)