summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/db/items/switcher.c10
-rw-r--r--src/analysis/db/items/switcher.h2
-rw-r--r--src/analysis/disass/links.c23
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);
+
}