From 104a4a970c98b8846548e03246d7301c3e1eb553 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Fri, 6 Jan 2017 05:25:37 +0100
Subject: Handled some special cases of instruction replacements when
 disassembling.

---
 ChangeLog                  |  5 +++++
 src/analysis/disass/area.c | 25 ++++++++++++++++++++++++-
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 729c4ad..4429480 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 17-01-06  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/analysis/disass/area.c:
+	Handle some special cases of instruction replacements when disassembling.
+
+17-01-06  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/arch/arm/v7/fetch.c:
 	* src/common/sort.c:
 	Update code.
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index a22f65a..84103e0 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -331,7 +331,30 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
 
     if (result)
     {
-        assert(area->instructions[offset] == NULL);
+        assert(area->instructions[offset] == NULL || force);
+
+#ifndef NDEBUG
+
+        /**
+         * Un cas de remplacement forcé intervient en ARM, lorsque qu'une
+         * instruction utilise une valeur immédiate placée dans le code.
+         *
+         * Cette valeur est référencée en tant que symbole.
+         *
+         * Mais cette même valeur a pu être désassemblée en tant que code
+         * exécutable si le flot d'exécution s'est poursuivi jusqu'à elle.
+         *
+         * C'est par exemple le cas lors de l'utilisation d'appels système
+         * en assembleur, qui ne sont pas reconnus en tant qu'instructions
+         * cassant le flot d'exécution (typiquement : un exit()).
+         */
+
+        if (area->instructions[offset] != NULL)
+        {
+            range = g_arch_instruction_get_range(area->instructions[offset]);
+            assert(len == get_mrange_length(range));
+        }
+#endif
 
         area->instructions[offset] = instr;
         g_atomic_pointer_add(&area->count, 1);
-- 
cgit v0.11.2-87-g4458