Fix some bugs in dex.c, marshal.c, panels.c and other code optimization and fixel (#18297)

This commit is contained in:
ChD1 2021-01-27 12:53:50 +03:00 committed by GitHub
parent 09cbd3d914
commit 580bdf2c52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 79 additions and 31 deletions

View File

@ -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";

View File

@ -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

View File

@ -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) {

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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) {

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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;
}
}