diff --git a/libr/core/cbin.c b/libr/core/cbin.c index 3ec4d895116ad..3fb34666577ac 100644 --- a/libr/core/cbin.c +++ b/libr/core/cbin.c @@ -202,7 +202,9 @@ R_API void r_core_bin_export_info(RCore *core, int mode) { r_strbuf_appendf (s0, "f %s @ %s\n", k, v); } else if (IS_MODE_SET (mode)) { ut64 nv = r_num_math (core->num, v); - r_flag_set (core->flags, k, nv, 0); + if (!r_flag_get (core->flags, k)) { + r_flag_set (core->flags, k, nv, 0); + } } #endif free (offset); @@ -283,14 +285,30 @@ R_API void r_core_bin_export_info(RCore *core, int mode) { r_strbuf_appendf (s2, "fl %s %s\n", k, v); #else if (IS_MODE_RAD (mode)) { - r_strbuf_appendf (s2, "fl %s %s\n", flagname, v); + r_strbuf_appendf (s2, "fl %s %s\n", k, v); } else if (IS_MODE_SET (mode)) { - RFlagItem *fi = r_flag_get (core->flags, flagname); +#if 0 + char *s = r_core_cmd_str ("k bin/cur/pe_overlay.size"); + free (s); +#else + RFlagItem *fi = r_flag_get (core->flags, k); if (fi) { fi->size = r_num_math (core->num, v); } else { - R_LOG_ERROR ("Cannot find flag named '%s'", flagname); + char *s = strdup (k); + char *kk = r_str_replace (s, ".size", ".offset", 0); + const char *addr = sdb_const_get (db, kk, 0); + if (R_STR_ISEMPTY (addr)) { + R_LOG_ERROR ("Cannot find flag named '%s'", k); + } else { + ut64 naddr = r_num_math (NULL, addr); + ut64 size = r_num_math (NULL, v); + r_flag_set (core->flags, k, naddr, size); + // r_core_cmdf (core, "fl %s %s@%s", k, v, addr); + } + free (kk); } +#endif } #endif } diff --git a/libr/core/cmd_flag.c b/libr/core/cmd_flag.c index 7c4cca62eb6ad..8e80419d6bdf2 100644 --- a/libr/core/cmd_flag.c +++ b/libr/core/cmd_flag.c @@ -1141,10 +1141,14 @@ static int cmd_flag(void *data, const char *input) { p = strchr (arg, ' '); if (p) { *p++ = 0; - item = r_flag_get_i (core->flags, - r_num_math (core->num, arg)); - if (item) - item->size = r_num_math (core->num, p); + ut64 narg = r_num_math (core->num, arg); + item = r_flag_get_i (core->flags, narg); + ut64 nsize = r_num_math (core->num, p); + if (item) { + item->size = nsize; + } else { + r_flag_set (core->flags, arg, core->offset, nsize); + } } else { if (*arg) { item = r_flag_get_i (core->flags, core->offset);