From 56e060d11c238ac7c7b3ecf0eb0527bbaebd5b4b Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 15 Jan 2017 10:56:05 +0100
Subject: Ensured that symbols always take priority over the disassembled code.

---
 ChangeLog                  |  6 ++++++
 src/analysis/disass/area.c | 20 ++++++++++++++------
 src/format/format.c        |  2 ++
 3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 82d5060..3339d96 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 17-01-15  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/analysis/disass/area.c:
+	* src/format/format.c:
+	Ensure that symbols always take priority over the disassembled code.
+
+17-01-15  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/analysis/db/items/comment.c:
 	Match the perfect line index.
 
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index 84103e0..7eacc29 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -314,6 +314,8 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
     const vmpa2t *addr;                     /* Début de la zone à traiter  */
     phys_t len;                             /* Taille de l'aire visée      */
     phys_t offset;                          /* Décallage de départ         */
+    phys_t i;                               /* Boucle de parcours          */
+    GArchInstruction *old;                  /* Instruction remplacée       */
 
     start = get_mrange_addr(&area->range);
 
@@ -333,8 +335,6 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
     {
         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.
@@ -347,14 +347,22 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
          * 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()).
+         *
+         * On réinitialise donc la zone couverte par la nouvelle instruction.
          */
 
-        if (area->instructions[offset] != NULL)
+        for (i = 0; force && i < len; i++)
         {
-            range = g_arch_instruction_get_range(area->instructions[offset]);
-            assert(len == get_mrange_length(range));
+            old = area->instructions[offset + i];
+
+            if (old != NULL)
+            {
+                g_object_unref(G_OBJECT(old));
+                area->instructions[offset + 1] = NULL;
+                g_atomic_pointer_add(&area->count, -1);
+            }
+
         }
-#endif
 
         area->instructions[offset] = instr;
         g_atomic_pointer_add(&area->count, 1);
diff --git a/src/format/format.c b/src/format/format.c
index be522cb..550e816 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -334,6 +334,8 @@ bool g_binary_format_add_symbol(GBinFormat *format, GBinSymbol *symbol)
         format->symbols = _qinsert(format->symbols, &format->symbols_count,
                                    sizeof(GBinSymbol *), &symbol, index);
 
+        result = true;
+
         switch (g_binary_symbol_get_target_type(symbol))
         {
             case STP_ROUTINE:
-- 
cgit v0.11.2-87-g4458