summaryrefslogtreecommitdiff
path: root/src/analysis/disass/rank.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-10-15 15:13:52 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-10-15 15:13:52 (GMT)
commit1aac673d39180b661f6a2dc5ff6335a1cfa0b0a7 (patch)
treeec410e5e959e6de9cff29e3032443b1067f2c522 /src/analysis/disass/rank.c
parent4c5f0e1341b094fed40f9e6944134545f971b1eb (diff)
Avoided many infinite loops when computing ranks in Dalvik basic blocks.
Diffstat (limited to 'src/analysis/disass/rank.c')
-rw-r--r--src/analysis/disass/rank.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/analysis/disass/rank.c b/src/analysis/disass/rank.c
index 0b9068b..7504231 100644
--- a/src/analysis/disass/rank.c
+++ b/src/analysis/disass/rank.c
@@ -324,6 +324,18 @@ void rank_routine_block(const GBlockList *list, GBasicBlock *block)
/* La boucle de remontée n'abaisse pas les rangs */
if (types[i] == ILT_LOOP) continue;
+ /**
+ * On se doit de suivre le même cheminement que celui emprunté lors
+ * du parcours de create_dragon_nodes().
+ * Sinon, les chemins divergent et une récursion infinie peut survenir.
+ */
+ if (types[i] != ILT_EXEC_FLOW
+ && types[i] != ILT_JUMP
+ && types[i] != ILT_CASE_JUMP
+ && types[i] != ILT_JUMP_IF_TRUE
+ && types[i] != ILT_JUMP_IF_FALSE)
+ continue;
+
target = g_block_list_find_by_starting_instr(list, dests[i]);
/**