Skip to content

Commit

Permalink
Don't check eob when handle it_block
Browse files Browse the repository at this point in the history
  • Loading branch information
bet4it committed May 12, 2020
1 parent 6f04791 commit 2e02dbe
Showing 1 changed file with 40 additions and 34 deletions.
74 changes: 40 additions & 34 deletions gum/arch-arm/gumthumbrelocator.c
Expand Up @@ -206,40 +206,41 @@ gum_thumb_relocator_read_one (GumThumbRelocator * self,
if (!cs_disasm_iter (self->capstone, &code, &size, &address, insn))
return 0;

switch (insn->id)
{
case ARM_INS_B:
case ARM_INS_BX:
self->eob = TRUE;
self->eoi = gum_arm_branch_is_unconditional (insn);
break;
case ARM_INS_CBZ:
case ARM_INS_CBNZ:
case ARM_INS_BL:
case ARM_INS_BLX:
self->eob = TRUE;
self->eoi = FALSE;
break;
case ARM_INS_LDR:
self->eob = self->eoi = gum_reg_dest_is_pc (insn);
break;
case ARM_INS_POP:
self->eob = self->eoi = gum_reg_list_contains_pc (insn, 0);
break;
case ARM_INS_LDM:
self->eob = self->eoi = gum_reg_list_contains_pc (insn, 1);
break;
case ARM_INS_IT:
if (!self->it_block.active)
switch (insn->id)
{
it_block_size = gum_parse_it_instruction_block_size (
GUINT16_FROM_LE (*((guint16 *) self->input_cur)));
self->eob = FALSE;
break;
case ARM_INS_B:
case ARM_INS_BX:
self->eob = TRUE;
self->eoi = gum_arm_branch_is_unconditional (insn);
break;
case ARM_INS_CBZ:
case ARM_INS_CBNZ:
case ARM_INS_BL:
case ARM_INS_BLX:
self->eob = TRUE;
self->eoi = FALSE;
break;
case ARM_INS_LDR:
self->eob = self->eoi = gum_reg_dest_is_pc (insn);
break;
case ARM_INS_POP:
self->eob = self->eoi = gum_reg_list_contains_pc (insn, 0);
break;
case ARM_INS_LDM:
self->eob = self->eoi = gum_reg_list_contains_pc (insn, 1);
break;
case ARM_INS_IT:
{
it_block_size = gum_parse_it_instruction_block_size (
GUINT16_FROM_LE (*((guint16 *) self->input_cur)));
self->eob = FALSE;
break;
}
default:
self->eob = FALSE;
break;
}
default:
self->eob = FALSE;
break;
}

gum_thumb_relocator_increment_inpos (self);

Expand All @@ -249,8 +250,13 @@ gum_thumb_relocator_read_one (GumThumbRelocator * self,
self->input_cur += insn->size;
self->input_pc += insn->size;

while (it_block_size--)
gum_thumb_relocator_read_one (self, NULL);
if (it_block_size > 0)
{
self->it_block.active = TRUE;
while (it_block_size--)
gum_thumb_relocator_read_one(self, NULL);
self->it_block.active = FALSE;
}

return self->input_cur - input_start;
}
Expand Down

0 comments on commit 2e02dbe

Please sign in to comment.