mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-25 00:31:08 +00:00
Fix some bugs in dex.c, marshal.c, panels.c and other code optimization and fixel (#18297)
This commit is contained in:
parent
09cbd3d914
commit
580bdf2c52
@ -102,6 +102,7 @@ static bool strbuf_rev_prepend_char(RStrBuf *sb, const char *s, int c) {
|
||||
char *sb_str = sb->ptr ? sb->ptr : sb->buf;
|
||||
char *pivot = strrchr (sb_str, c);
|
||||
if (!pivot) {
|
||||
free (ns);
|
||||
return false;
|
||||
}
|
||||
size_t idx = pivot - sb_str;
|
||||
@ -869,12 +870,12 @@ static const char *map_dwarf_reg_to_ppc64_reg(ut64 reg_num, VariableLocationKind
|
||||
case 6: return "r6";
|
||||
case 7: return "r7";
|
||||
case 8: return "r8";
|
||||
case 9: return "r8";
|
||||
case 10: return "r9";
|
||||
case 11: return "r10";
|
||||
case 12: return "r11";
|
||||
case 13: return "r12";
|
||||
case 14: return "r13";
|
||||
case 9: return "r9";
|
||||
case 10: return "r10";
|
||||
case 11: return "r11";
|
||||
case 12: return "r12";
|
||||
case 13: return "r13";
|
||||
case 14: return "r14";
|
||||
case 15: return "r15";
|
||||
case 16: return "r16";
|
||||
case 17: return "r17";
|
||||
|
@ -1951,7 +1951,7 @@ static bool esil_poke_n(RAnalEsil *esil, int bits) {
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
ret = -1;
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
// this is a internal peek performed before a poke
|
||||
|
@ -344,7 +344,7 @@ RBinDexObj *r_bin_dex_new_buf(RBuffer *buf, bool verbose) {
|
||||
}
|
||||
}
|
||||
dexhdr->method_size = methods_size / sizeof (struct dex_method_t);
|
||||
dex->methods = (struct dex_method_t *) calloc (methods_size + 1, 1);
|
||||
dex->methods = (struct dex_method_t *) calloc (methods_size + 1, sizeof (struct dex_method_t));
|
||||
for (i = 0; i < dexhdr->method_size; i++) {
|
||||
ut64 offset = dexhdr->method_offset + i * sizeof (struct dex_method_t);
|
||||
if (offset + 8 > dex->size) {
|
||||
@ -365,7 +365,7 @@ RBinDexObj *r_bin_dex_new_buf(RBuffer *buf, bool verbose) {
|
||||
types_size = dex->size - dexhdr->types_offset;
|
||||
}
|
||||
dexhdr->types_size = types_size / sizeof (struct dex_type_t);
|
||||
dex->types = (struct dex_type_t *) calloc (types_size + 1, 1);
|
||||
dex->types = (struct dex_type_t *) calloc (types_size + 1, sizeof (struct dex_type_t));
|
||||
for (i = 0; i < dexhdr->types_size; i++) {
|
||||
ut64 offset = dexhdr->types_offset + i * sizeof (struct dex_type_t);
|
||||
if (offset + 4 > dex->size) {
|
||||
@ -388,7 +388,7 @@ RBinDexObj *r_bin_dex_new_buf(RBuffer *buf, bool verbose) {
|
||||
}
|
||||
}
|
||||
dexhdr->fields_size = fields_size / sizeof (struct dex_field_t);
|
||||
dex->fields = (struct dex_field_t *) calloc (fields_size + 1, 1);
|
||||
dex->fields = (struct dex_field_t *) calloc (fields_size + 1, sizeof (struct dex_field_t));
|
||||
for (i = 0; i < dexhdr->fields_size; i++) {
|
||||
ut64 offset = dexhdr->fields_offset + i * sizeof (struct dex_field_t);
|
||||
if (offset + 8 > dex->size) {
|
||||
@ -415,7 +415,7 @@ RBinDexObj *r_bin_dex_new_buf(RBuffer *buf, bool verbose) {
|
||||
}
|
||||
}
|
||||
dexhdr->prototypes_size = protos_size / sizeof (struct dex_proto_t);
|
||||
dex->protos = (struct dex_proto_t *) calloc (protos_size + 1, 1);
|
||||
dex->protos = (struct dex_proto_t *) calloc (protos_size + 1, sizeof (struct dex_proto_t));
|
||||
for (i = 0; i < dexhdr->prototypes_size; i++) {
|
||||
ut64 offset = dexhdr->prototypes_offset + i * sizeof (struct dex_proto_t);
|
||||
if (offset + 12 > dex->size) {
|
||||
|
@ -2809,6 +2809,7 @@ const RList *MACH0_(get_symbols_list)(struct MACH0_(obj_t) *bin) {
|
||||
}
|
||||
ht_pp_free (hash);
|
||||
// bin->symbols = symbols;
|
||||
free (symbols);
|
||||
return list;
|
||||
}
|
||||
|
||||
|
@ -337,6 +337,7 @@ static pyc_object *get_complex_object(RBuffer *buffer) {
|
||||
}
|
||||
ut8 *s1 = malloc (n1 + 1);
|
||||
if (!s1) {
|
||||
free (ret);
|
||||
return NULL;
|
||||
}
|
||||
/* object contain string representation of the number */
|
||||
@ -1025,14 +1026,19 @@ static pyc_object *get_object(RBuffer *buffer) {
|
||||
|
||||
switch (type) {
|
||||
case TYPE_NULL:
|
||||
free_object (ret);
|
||||
return NULL;
|
||||
case TYPE_TRUE:
|
||||
free_object (ret);
|
||||
return get_true_object ();
|
||||
case TYPE_FALSE:
|
||||
free_object (ret);
|
||||
return get_false_object ();
|
||||
case TYPE_NONE:
|
||||
free_object (ret);
|
||||
return get_none_object ();
|
||||
case TYPE_REF:
|
||||
free_object (ret);
|
||||
return get_ref_object (buffer);
|
||||
case TYPE_SMALL_TUPLE:
|
||||
ret = get_small_tuple_object (buffer);
|
||||
@ -1108,16 +1114,16 @@ static pyc_object *get_object(RBuffer *buffer) {
|
||||
ret = get_set_object (buffer);
|
||||
break;
|
||||
case TYPE_STOPITER:
|
||||
ret = R_NEW0 (pyc_object);
|
||||
break;
|
||||
case TYPE_ELLIPSIS:
|
||||
ret = R_NEW0 (pyc_object);
|
||||
break;
|
||||
case TYPE_UNKNOWN:
|
||||
eprintf ("Get not implemented for type 0x%x\n", type);
|
||||
free_object (ret);
|
||||
return NULL;
|
||||
default:
|
||||
eprintf ("Undefined type in get_object (0x%x)\n", type);
|
||||
free_object (ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -1148,8 +1148,10 @@ static void __vi_mode(void) {
|
||||
__delete_next_char ();
|
||||
}
|
||||
break;
|
||||
case 'c':
|
||||
case 'c': {
|
||||
I.vi_mode = INSERT_MODE; // goto insert mode
|
||||
break;
|
||||
}
|
||||
case 'd': {
|
||||
char c = r_cons_readchar ();
|
||||
while (rep--) {
|
||||
@ -1235,6 +1237,7 @@ static void __vi_mode(void) {
|
||||
break;
|
||||
case 'a':
|
||||
__move_cursor_right ();
|
||||
break;
|
||||
case 'i':
|
||||
I.vi_mode = INSERT_MODE;
|
||||
if (I.hud) {
|
||||
@ -1832,6 +1835,7 @@ R_API const char *r_line_readline_cb(RLineReadCallback cb, void *user) {
|
||||
break;
|
||||
case 0x37: // HOME xrvt-unicode
|
||||
r_cons_readchar ();
|
||||
break;
|
||||
case 0x48: // HOME
|
||||
if (I.sel_widget) {
|
||||
selection_widget_up (I.sel_widget->options_len - 1);
|
||||
|
@ -617,7 +617,8 @@ R_API int r_cons_pal_set(const char *key, const char *val) {
|
||||
for (i = 0; keys[i].name; i++) {
|
||||
if (!strcmp (key, keys[i].name)) {
|
||||
rcolor = RCOLOR_AT (i);
|
||||
r_cons_pal_parse (val, rcolor);
|
||||
char *r = r_cons_pal_parse (val, rcolor);
|
||||
free (r);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -507,10 +507,12 @@ R_API void r_core_anal_type_match(RCore *core, RAnalFunction *fcn) {
|
||||
char *ret_reg = NULL;
|
||||
const char *pc = r_reg_get_name (core->dbg->reg, R_REG_NAME_PC);
|
||||
if (!pc) {
|
||||
free (buf);
|
||||
return;
|
||||
}
|
||||
RRegItem *r = r_reg_get (core->dbg->reg, pc, -1);
|
||||
if (!r) {
|
||||
free (buf);
|
||||
return;
|
||||
}
|
||||
r_cons_break_push (NULL, NULL);
|
||||
|
@ -1926,6 +1926,8 @@ static int cmd_open(void *data, const char *input) {
|
||||
if ((fdx == -1) || (fd == -1) || (fdx == fd)) {
|
||||
free (inp);
|
||||
break;
|
||||
} else {
|
||||
free (inp);
|
||||
}
|
||||
r_io_desc_exchange (core->io, fd, fdx);
|
||||
r_core_block_read (core);
|
||||
|
@ -366,7 +366,7 @@ static const char *get_utf8_char(const char line, RDisasmState *ds) {
|
||||
case '>': return ds->core->cons->vline[ARROW_RIGHT];
|
||||
case ':': return ds->core->cons->vline[LINE_UP];
|
||||
case '|': return ds->core->cons->vline[LINE_VERT];
|
||||
case '=': return ds->core->cons->vline[LINE_HORIZ];
|
||||
case '=':
|
||||
case '-': return ds->core->cons->vline[LINE_HORIZ];
|
||||
case ',': return ds->core->cons->vline[CORNER_TL];
|
||||
case '.': return ds->core->cons->vline[CORNER_TR];
|
||||
@ -2389,7 +2389,6 @@ static void ds_update_ref_lines(RDisasmState *ds) {
|
||||
free (ds->prev_line_col);
|
||||
ds->refline = strdup ("");
|
||||
ds->refline2 = strdup ("");
|
||||
ds->prev_line_col = strdup ("");
|
||||
ds->line = NULL;
|
||||
ds->line_col = NULL;
|
||||
ds->prev_line_col = NULL;
|
||||
@ -5762,7 +5761,6 @@ toro:
|
||||
core->parser->flagspace = ofs;
|
||||
free (ds->opstr);
|
||||
ds->opstr = asm_str;
|
||||
core->parser->flagspace = ofs; // ???
|
||||
} else {
|
||||
ds->opstr = strdup (r_asm_op_get_asm (&ds->asmop));
|
||||
}
|
||||
@ -6208,6 +6206,7 @@ R_API int r_core_print_disasm_all(RCore *core, ut64 addr, int l, int len, int mo
|
||||
if (mode == 'j') {
|
||||
pj = r_core_pj_new (core);
|
||||
if (!pj) {
|
||||
ds_free (ds);
|
||||
return 0;
|
||||
}
|
||||
pj_a (pj);
|
||||
@ -6409,13 +6408,7 @@ toro:
|
||||
}
|
||||
continue;
|
||||
case R_META_TYPE_STRING:
|
||||
//r_cons_printf (".string: %s\n", meta->str);
|
||||
i += meta_size;
|
||||
continue;
|
||||
case R_META_TYPE_FORMAT:
|
||||
//r_cons_printf (".format : %s\n", meta->str);
|
||||
i += meta_size;
|
||||
continue;
|
||||
case R_META_TYPE_MAGIC:
|
||||
//r_cons_printf (".magic : %s\n", meta->str);
|
||||
i += meta_size;
|
||||
|
@ -774,6 +774,7 @@ static int GH(print_single_linked_list_bin)(RCore *core, MallocState *main_arena
|
||||
|
||||
GHT bin = main_arena->GH(fastbinsY)[bin_num];
|
||||
if (!bin) {
|
||||
free (cnk);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -1122,6 +1123,11 @@ static void GH(print_heap_segment)(RCore *core, MallocState *main_arena,
|
||||
|
||||
if (!r_io_read_at (core->io, next_chunk, (ut8 *)cnk, sizeof (GH(RHeapChunk)))) {
|
||||
eprintf ("Cannot read");
|
||||
free (cnk);
|
||||
free (cnk_next);
|
||||
r_cons_canvas_free (can);
|
||||
r_config_hold_restore (hc);
|
||||
r_config_hold_free (hc);
|
||||
return;
|
||||
}
|
||||
size_tmp = (cnk->size >> 3) << 3;
|
||||
|
@ -491,7 +491,7 @@ static char *__show_status_input(RCore *core, const char *msg) {
|
||||
}
|
||||
|
||||
static bool __check_panel_type(RPanel *panel, const char *type) {
|
||||
if (!panel->model->cmd || !type) {
|
||||
if (!panel || !panel->model->cmd || !type) {
|
||||
return false;
|
||||
}
|
||||
char *tmp = r_str_new (panel->model->cmd);
|
||||
@ -1067,6 +1067,9 @@ static void __set_rcb(RPanels *ps, RPanel *p) {
|
||||
}
|
||||
|
||||
static void __init_panel_param(RCore *core, RPanel *p, const char *title, const char *cmd) {
|
||||
if (!p) {
|
||||
return;
|
||||
}
|
||||
RPanelModel *m = p->model;
|
||||
RPanelView *v = p->view;
|
||||
m->type = PANEL_TYPE_DEFAULT;
|
||||
@ -1554,22 +1557,34 @@ static void __cursor_down(RCore *core) {
|
||||
}
|
||||
|
||||
static void __save_panel_pos(RPanel* panel) {
|
||||
if (!panel) {
|
||||
return;
|
||||
}
|
||||
__set_geometry (&panel->view->prevPos, panel->view->pos.x, panel->view->pos.y,
|
||||
panel->view->pos.w, panel->view->pos.h);
|
||||
}
|
||||
|
||||
static void __restore_panel_pos(RPanel* panel) {
|
||||
if(!panel){
|
||||
return;
|
||||
}
|
||||
__set_geometry (&panel->view->pos, panel->view->prevPos.x, panel->view->prevPos.y,
|
||||
panel->view->prevPos.w, panel->view->prevPos.h);
|
||||
}
|
||||
|
||||
static void __maximize_panel_size(RPanels *panels) {
|
||||
RPanel *cur = __get_cur_panel (panels);
|
||||
if(!cur){
|
||||
return;
|
||||
}
|
||||
__set_geometry (&cur->view->pos, 0, 1, panels->can->w, panels->can->h - 1);
|
||||
cur->view->refresh = true;
|
||||
}
|
||||
|
||||
static void __dismantle_panel(RPanels *ps, RPanel *p) {
|
||||
if (!p) {
|
||||
return;
|
||||
}
|
||||
RPanel *justLeftPanel = NULL, *justRightPanel = NULL, *justUpPanel = NULL, *justDownPanel = NULL;
|
||||
RPanel *tmpPanel = NULL;
|
||||
bool leftUpValid = false, leftDownValid = false, rightUpValid = false, rightDownValid = false,
|
||||
@ -1827,6 +1842,9 @@ static void __init_sdb(RCore *core) {
|
||||
}
|
||||
|
||||
static void __free_panel_model(RPanel *panel) {
|
||||
if (!panel) {
|
||||
return;
|
||||
}
|
||||
free (panel->model->title);
|
||||
free (panel->model->cmd);
|
||||
free (panel->model->cmdStrCache);
|
||||
@ -1855,6 +1873,9 @@ static void __create_panel(RCore *core, RPanel *panel, const RPanelLayout dir, R
|
||||
if (!__check_panel_num (core)) {
|
||||
return;
|
||||
}
|
||||
if (!panel) {
|
||||
return;
|
||||
}
|
||||
switch (dir) {
|
||||
case PANEL_LAYOUT_VERTICAL:
|
||||
__split_panel_vertical (core, panel, title, cmd);
|
||||
@ -7038,4 +7059,3 @@ static void __init_new_panels_root(RCore *core) {
|
||||
__panels_layout (panels);
|
||||
core->panels = prev;
|
||||
}
|
||||
|
||||
|
@ -785,11 +785,15 @@ R_API int r_core_visual_types(RCore *core) {
|
||||
/* TODO: edit field */
|
||||
} else {
|
||||
switch (h_opt) {
|
||||
case 0: // type
|
||||
case 0: { // type
|
||||
/* TODO: do something with this data */
|
||||
prompt ("name: ", vt.curname);
|
||||
prompt ("pf: ", vt.curfmt);
|
||||
char *r = NULL;
|
||||
r = prompt ("name: ", vt.curname);
|
||||
free (r);
|
||||
r = prompt ("pf: ", vt.curfmt);
|
||||
free (r);
|
||||
break;
|
||||
}
|
||||
case 1: // enum
|
||||
case 2: // struct
|
||||
free (optword);
|
||||
|
@ -887,7 +887,8 @@ R_API int r_main_rabin2(int argc, const char **argv) {
|
||||
R_FREE (res);
|
||||
R_FREE (file);
|
||||
}
|
||||
stdin_gets (true);
|
||||
char *r = stdin_gets (true);
|
||||
free (r);
|
||||
} else {
|
||||
res = __demangleAs (bin, type, file);
|
||||
if (res && *res) {
|
||||
|
@ -509,6 +509,7 @@ R_API int r_main_radare2(int argc, const char **argv) {
|
||||
r_cons_flush ();
|
||||
LISTS_FREE ();
|
||||
free (envprofile);
|
||||
free (debugbackend);
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@ -532,6 +533,7 @@ R_API int r_main_radare2(int argc, const char **argv) {
|
||||
case 'H':
|
||||
main_print_var (opt.arg);
|
||||
LISTS_FREE ();
|
||||
free (debugbackend);
|
||||
return 0;
|
||||
case 'i':
|
||||
if (R_STR_ISEMPTY (opt.arg)) {
|
||||
@ -587,6 +589,7 @@ R_API int r_main_radare2(int argc, const char **argv) {
|
||||
r_core_project_list (r, 0);
|
||||
r_cons_flush ();
|
||||
free (envprofile);
|
||||
free (debugbackend);
|
||||
LISTS_FREE ();
|
||||
return 0;
|
||||
}
|
||||
|
@ -653,6 +653,10 @@ R_API int r_main_rahash2(int argc, const char **argv) {
|
||||
if (rad == 'j') {
|
||||
pj = pj_new ();
|
||||
if (!pj) {
|
||||
if (str != hashstr) {
|
||||
free (str);
|
||||
}
|
||||
free (iv);
|
||||
return 1;
|
||||
}
|
||||
pj_a (pj);
|
||||
|
@ -1582,7 +1582,6 @@ R_API int r_print_format_struct_size(RPrint *p, const char *f, int mode, int n)
|
||||
*end = '\0';
|
||||
times = r_num_math (NULL, fmt + i + 1);
|
||||
fmt = end + 1;
|
||||
i = 0;
|
||||
}
|
||||
if (fmt[0] == '0') {
|
||||
mode |= R_PRINT_UNIONMODE;
|
||||
|
@ -326,6 +326,7 @@ R_API RCMS *r_pkcs7_parse_cms(const ut8 *buffer, ut32 length) {
|
||||
container->contentType = r_asn1_stringify_oid (object->list.objects[0]->sector, object->list.objects[0]->length);
|
||||
if (!container->contentType) {
|
||||
r_asn1_free_object (object);
|
||||
free (container);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user