diff options
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/db/items/switcher.c | 10 | ||||
-rw-r--r-- | src/analysis/db/items/switcher.h | 2 | ||||
-rw-r--r-- | src/analysis/disass/links.c | 23 |
3 files changed, 25 insertions, 10 deletions
diff --git a/src/analysis/db/items/switcher.c b/src/analysis/db/items/switcher.c index 01c1910..9cd2a2e 100644 --- a/src/analysis/db/items/switcher.c +++ b/src/analysis/db/items/switcher.c @@ -264,7 +264,7 @@ static void g_db_switcher_finalize(GDbSwitcher *switcher) * * ******************************************************************************/ -GDbSwitcher *g_db_switcher_new(const GArchInstruction *instr, const GImmOperand *imm, ImmOperandDisplay display) +GDbSwitcher *g_db_switcher_new(GArchInstruction *instr, const GImmOperand *imm, ImmOperandDisplay display) { GDbSwitcher *result; /* Instance à retourner */ size_t count; /* Nombre d'opérandes à visiter*/ @@ -273,12 +273,16 @@ GDbSwitcher *g_db_switcher_new(const GArchInstruction *instr, const GImmOperand /* Recherche de la position de l'opérande */ - count = g_arch_instruction_count_operands(instr); + g_arch_instruction_lock_operands(instr); + + count = _g_arch_instruction_count_operands(instr); for (i = 0; i < count; i++) - if (G_ARCH_OPERAND(imm) == g_arch_instruction_get_operand(instr, i)) + if (G_ARCH_OPERAND(imm) == _g_arch_instruction_get_operand(instr, i)) break; + g_arch_instruction_unlock_operands(instr); + if (i == count) return NULL; diff --git a/src/analysis/db/items/switcher.h b/src/analysis/db/items/switcher.h index d155a13..7fda6d7 100644 --- a/src/analysis/db/items/switcher.h +++ b/src/analysis/db/items/switcher.h @@ -57,7 +57,7 @@ typedef struct _GDbSwitcherClass GDbSwitcherClass; GType g_db_switcher_get_type(void); /* Crée une définition d'un signet dans une zone de texte. */ -GDbSwitcher *g_db_switcher_new(const GArchInstruction *, const GImmOperand *, ImmOperandDisplay); +GDbSwitcher *g_db_switcher_new(GArchInstruction *, const GImmOperand *, ImmOperandDisplay); #if 0 /* Fournit l'adresse associée à un signet. */ diff --git a/src/analysis/disass/links.c b/src/analysis/disass/links.c index 0884dce..abe26d6 100644 --- a/src/analysis/disass/links.c +++ b/src/analysis/disass/links.c @@ -185,12 +185,15 @@ static void convert_immediate_into_target(GArchInstruction *instr, size_t index, vmpa2t target; /* Défination finale précise */ GArchOperand *new; /* Instruction de ciblage */ - op = g_arch_instruction_get_operand(instr, index); - if (!G_IS_IMM_OPERAND(op)) return; + op = _g_arch_instruction_get_operand(instr, index); + + if (!G_IS_IMM_OPERAND(op)) + goto ciit_done; imm = G_IMM_OPERAND(op); - if (g_imm_operand_get_display(imm) != IOD_HEX) return; + if (g_imm_operand_get_display(imm) != IOD_HEX) + goto ciit_done; if (g_imm_operand_to_virt_t(imm, &addr)) { @@ -203,12 +206,16 @@ static void convert_immediate_into_target(GArchInstruction *instr, size_t index, if (!g_target_operand_resolve(G_TARGET_OPERAND(new), format, false)) g_object_unref(G_OBJECT(new)); else - g_arch_instruction_replace_operand(instr, new, op); + _g_arch_instruction_replace_operand(instr, new, op); } } + ciit_done: + + ; + } @@ -240,14 +247,16 @@ void establish_links_for_instruction(GArchInstruction *instr, GBinFormat *format else skip = false; - count = g_arch_instruction_count_operands(instr); + g_arch_instruction_lock_operands(instr); + + count = _g_arch_instruction_count_operands(instr); for (i = 0; i < count; i++) { if (!skip) convert_immediate_into_target(instr, i, format); - op = g_arch_instruction_get_operand(instr, i); + op = _g_arch_instruction_get_operand(instr, i); if (!G_IS_TARGET_OPERAND(op)) continue; g_target_operand_get_addr(G_TARGET_OPERAND(op), &addr); @@ -262,4 +271,6 @@ void establish_links_for_instruction(GArchInstruction *instr, GBinFormat *format } + g_arch_instruction_unlock_operands(instr); + } |