diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-10-15 15:13:52 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-10-15 15:13:52 (GMT) |
commit | 1aac673d39180b661f6a2dc5ff6335a1cfa0b0a7 (patch) | |
tree | ec410e5e959e6de9cff29e3032443b1067f2c522 /src/analysis/disass/rank.c | |
parent | 4c5f0e1341b094fed40f9e6944134545f971b1eb (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.c | 12 |
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]); /** |