mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-07 02:23:58 +00:00
Fix memleak in db/asm/arm_64
This commit is contained in:
parent
0209fd7bda
commit
1d62d7df13
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user