Fix memleak in db/asm/arm_64

This commit is contained in:
Qijia Liu 2021-01-13 18:07:16 +00:00 committed by pancake
parent 0209fd7bda
commit 1d62d7df13
2 changed files with 56 additions and 160 deletions

View File

@ -1076,11 +1076,11 @@ rip:
if (proc->ret != 0) {
goto ship;
}
free (hex);
char *disasm = r_strbuf_drain_nofree (&proc->out);
r_str_trim (disasm);
out->disasm = disasm;
ship:
free (hex);
r_pvector_pop (&args);
r_pvector_pop (&args);
r2r_subprocess_free (proc);

View File

@ -1285,222 +1285,118 @@ static bool handlePAC(ut32 *op, const char *str) {
bool arm64ass(const char *str, ut64 addr, ut32 *op) {
ArmOp ops = {0};
if (!parseOpcode (str, &ops)) {
free (ops.mnemonic);
return false;
}
/* TODO: write tests for this and move out the regsize logic into the mov */
if (!strncmp (str, "mov", 3)) {
*op = mov (&ops);
return *op != -1;
}
if (!strncmp (str, "cb", 2)) {
} else if (!strncmp (str, "cb", 2)) {
*op = cb (&ops);
return *op != -1;
}
if (!strncmp (str, "cmp", 3)) {
} else if (!strncmp (str, "cmp", 3)) {
*op = cmp (&ops);
return *op != -1;
}
if (!strncmp (str, "ldrb", 4)) {
} else if (!strncmp (str, "ldrb", 4)) {
*op = lsop (&ops, 0x00004038, -1);
return *op != -1;
}
if (!strncmp (str, "ldrh", 4)) {
} else if (!strncmp (str, "ldrh", 4)) {
*op = lsop (&ops, 0x00004078, -1);
return *op != -1;
}
if (!strncmp (str, "ldrsh", 5)) {
} else if (!strncmp (str, "ldrsh", 5)) {
*op = lsop (&ops, 0x00008078, -1);
return *op != -1;
}
if (!strncmp (str, "ldrsw", 5)) {
} else if (!strncmp (str, "ldrsw", 5)) {
*op = lsop (&ops, 0x00000098, addr);
return *op != -1;
}
if (!strncmp (str, "ldrsb", 5)) {
} else if (!strncmp (str, "ldrsb", 5)) {
*op = lsop (&ops, 0x00008038, -1);
return *op != -1;
}
if (!strncmp (str, "strb", 4)) {
} else if (!strncmp (str, "strb", 4)) {
*op = lsop (&ops, 0x00000038, -1);
return *op != -1;
}
if (!strncmp (str, "strh", 4)) {
} else if (!strncmp (str, "strh", 4)) {
*op = lsop (&ops, 0x00000078, -1);
return *op != -1;
}
if (!strncmp (str, "ldr", 3)) {
} else if (!strncmp (str, "ldr", 3)) {
*op = reglsop (&ops, 0x000040f8);
return *op != -1;
}
if (!strncmp (str, "stur", 4)) {
} else if (!strncmp (str, "stur", 4)) {
*op = regsluop (&ops, 0x000000f8);
return *op != -1;
}
if (!strncmp (str, "ldur", 4)) {
} else if (!strncmp (str, "ldur", 4)) {
*op = regsluop (&ops, 0x000040f8);
return *op != -1;
}
if (!strncmp (str, "str", 3)) {
} else if (!strncmp (str, "str", 3)) {
*op = reglsop (&ops, 0x000000f8);
return *op != -1;
}
if (!strncmp (str, "stp", 3)) {
} else if (!strncmp (str, "stp", 3)) {
*op = stp (&ops, 0x000000a9);
return *op != -1;
}
if (!strncmp (str, "ldp", 3)) {
} else if (!strncmp (str, "ldp", 3)) {
*op = stp (&ops, 0x000040a9);
return *op != -1;
}
if (!strncmp (str, "sub", 3)) { // w
} else if (!strncmp (str, "sub", 3)) { // w
*op = arithmetic (&ops, 0xd1);
return *op != -1;
}
if (!strncmp (str, "add x", 5)) {
} else if (!strncmp (str, "add x", 5)) {
*op = arithmetic (&ops, 0x91);
return *op != -1;
}
if (!strncmp (str, "add w", 5)) {
} else if (!strncmp (str, "add w", 5)) {
*op = arithmetic (&ops, 0x11);
return *op != -1;
}
if (!strncmp (str, "adr x", 5)) { // w
} else if (!strncmp (str, "adr x", 5)) { // w
*op = adr (&ops, addr);
return *op != -1;
}
if (!strncmp (str, "adrp x", 6)) {
} else if (!strncmp (str, "adrp x", 6)) {
*op = adrp (&ops, addr, 0x00000090);
return *op != -1;
}
if (!strncmp (str, "neg", 3)) {
} else if (!strncmp (str, "neg", 3)) {
*op = neg (&ops);
return *op != -1;
}
if (!strcmp (str, "isb")) {
} else if (!strcmp (str, "isb")) {
*op = 0xdf3f03d5;
return *op != -1;
}
// PAC
if (handlePAC (op, str)) {
} else if (handlePAC (op, str)) { // PAC
free (ops.mnemonic);
return true;
}
if (!strcmp (str, "nop")) {
} else if (!strcmp (str, "nop")) {
*op = 0x1f2003d5;
return *op != -1;
}
if (!strcmp (str, "ret")) {
} else if (!strcmp (str, "ret")) {
*op = 0xc0035fd6;
return true;
}
if (!strncmp (str, "msr ", 4)) {
} else if (!strncmp (str, "msr ", 4)) {
*op = msr (&ops, 0);
if (*op != UT32_MAX) {
return true;
}
}
if (!strncmp (str, "mrs ", 4)) {
} else if (!strncmp (str, "mrs ", 4)) {
*op = msr (&ops, 1);
if (*op != UT32_MAX) {
return true;
}
}
if (!strncmp (str, "ands ", 5)) {
} else if (!strncmp (str, "ands ", 5)) {
*op = logical (&ops, false, ARM_ANDS);
return *op != UT32_MAX;
}
if (!strncmp (str, "and ", 4)) {
} else if (!strncmp (str, "and ", 4)) {
*op = logical (&ops, false, ARM_AND);
return *op != UT32_MAX;
}
if (!strncmp (str, "bics ", 5)) {
} else if (!strncmp (str, "bics ", 5)) {
*op = logical (&ops, true, ARM_ANDS);
return *op != UT32_MAX;
}
if (!strncmp (str, "bic ", 4)) {
} else if (!strncmp (str, "bic ", 4)) {
*op = logical (&ops, true, ARM_AND);
return *op != UT32_MAX;
}
if (!strncmp (str, "eon ", 4)) {
} else if (!strncmp (str, "eon ", 4)) {
*op = logical (&ops, true, ARM_EOR);
return *op != UT32_MAX;
}
if (!strncmp (str, "eor ", 4)) {
} else if (!strncmp (str, "eor ", 4)) {
*op = logical (&ops, false, ARM_EOR);
return *op != UT32_MAX;
}
if (!strncmp (str, "orn ", 4)) {
} else if (!strncmp (str, "orn ", 4)) {
*op = logical (&ops, true, ARM_ORR);
return *op != UT32_MAX;
}
if (!strncmp (str, "orr ", 4)) {
} else if (!strncmp (str, "orr ", 4)) {
*op = logical (&ops, false, ARM_ORR);
return *op != UT32_MAX;
}
if (!strncmp (str, "svc ", 4)) { // system level exception
} else if (!strncmp (str, "svc ", 4)) { // system level exception
*op = exception (&ops, 0x010000d4);
return *op != -1;
}
if (!strncmp (str, "hvc ", 4)) { // hypervisor level exception
} else if (!strncmp (str, "hvc ", 4)) { // hypervisor level exception
*op = exception (&ops, 0x020000d4);
return *op != -1;
}
if (!strncmp (str, "smc ", 4)) { // secure monitor exception
} else if (!strncmp (str, "smc ", 4)) { // secure monitor exception
*op = exception (&ops, 0x030000d4);
return *op != -1;
}
if (!strncmp (str, "brk ", 4)) { // breakpoint
} else if (!strncmp (str, "brk ", 4)) { // breakpoint
*op = exception (&ops, 0x000020d4);
return *op != -1;
}
if (!strncmp (str, "hlt ", 4)) { // halt
} else if (!strncmp (str, "hlt ", 4)) { // halt
*op = exception (&ops, 0x000040d4);
return *op != -1;
}
if (!strncmp (str, "b ", 2)) {
} else if (!strncmp (str, "b ", 2)) {
*op = branch (&ops, addr, 0x14);
return *op != -1;
}
if (!strncmp (str, "b.eq ", 5)) {
} else if (!strncmp (str, "b.eq ", 5)) {
*op = bdot (&ops, addr, 0x00000054);
return *op != -1;
}
if (!strncmp (str, "b.hs ", 5)) {
} else if (!strncmp (str, "b.hs ", 5)) {
*op = bdot (&ops, addr, 0x02000054);
return *op != -1;
}
if (!strncmp (str, "bl ", 3)) {
} else if (!strncmp (str, "bl ", 3)) {
*op = branch (&ops, addr, 0x94);
return *op != -1;
}
if (!strncmp (str, "br x", 4)) {
} else if (!strncmp (str, "br x", 4)) {
*op = branch (&ops, addr, 0x1fd6);
return *op != -1;
}
if (!strncmp (str, "blr x", 5)) {
} else if (!strncmp (str, "blr x", 5)) {
*op = branch (&ops, addr, 0x3fd6);
return *op != -1;
}
if (!strncmp (str, "dmb ", 4)) {
} else if (!strncmp (str, "dmb ", 4)) {
*op = mem_barrier (&ops, addr, 0xbf3003d5);
return *op != -1;
}
if (!strncmp (str, "dsb ", 4)) {
} else if (!strncmp (str, "dsb ", 4)) {
*op = mem_barrier (&ops, addr, 0x9f3003d5);
return *op != -1;
}
if (!strncmp (str, "isb", 3)) {
} else if (!strncmp (str, "isb", 3)) {
*op = mem_barrier (&ops, addr, 0xdf3f03d5);
return *op != -1;
}
if (!strncmp (str, "sbfiz ", 6) || !strncmp (str, "sbfm ", 5)
} else if (!strncmp (str, "sbfiz ", 6) || !strncmp (str, "sbfm ", 5)
|| !strncmp (str, "sbfx ", 5)) {
*op = bitfield (&ops, 0x00000013);
return *op != UT32_MAX;
}
if (!strncmp (str, "ubfiz ", 6) || !strncmp (str, "ubfm ", 5)
} else if (!strncmp (str, "ubfiz ", 6) || !strncmp (str, "ubfm ", 5)
|| !strncmp (str, "ubfx ", 5)) {
*op = bitfield (&ops, 0x00000053);
return *op != UT32_MAX;
}
return false;
free (ops.mnemonic);
return *op != UT32_MAX;
}