From b9e8a23f725570e4ac40a4625f51e933deaff25a Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Thu, 24 May 2018 11:13:44 +0200
Subject: Kept the ownership of inserted instructions longer.

---
 src/analysis/disass/area.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index 5e89daa..655d5af 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -470,7 +470,10 @@ static void mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
     if (instr != NULL)
     {
         area->instructions[start] = instr;
+        g_object_ref(G_OBJECT(instr));
+
         g_atomic_pointer_add(&area->count, 1);
+
     }
 
 }
@@ -760,8 +763,6 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, GProc
 
         gtk_status_stack_update_activity_value(status, id, diff);
 
-        assert(is_range_busy_in_mem_area(area, i, diff));
-
         /* Enregistrement d'un éventuel début de routine */
 
         if (g_arch_instruction_get_flags(instr) & AIF_ROUTINE_START)
@@ -778,11 +779,17 @@ void load_code_from_mem_area(mem_area *area, mem_area *list, size_t count, GProc
              extra = g_preload_info_pop_instruction(G_PRELOAD_INFO(ctx)))
         {
             insert_instr_into_mem_areas_forced(list, count, extra);
+            g_object_unref(G_OBJECT(extra));
         }
 
         /* Rupture du flot d'exécution ? */
         if (forced_once || g_arch_instruction_get_flags(instr) & AIF_RETURN_POINT)
+        {
+            g_object_unref(G_OBJECT(instr));
             break;
+        }
+        else
+            g_object_unref(G_OBJECT(instr));
 
     }
 
@@ -854,16 +861,13 @@ static void load_data_from_mem_area(mem_area *area, GProcContext *ctx, const vmp
 
         done = insert_instr_into_mem_areas(area, 1, instr, (mem_area *[]) { area });
 
+        g_object_unref(G_OBJECT(instr));
+
         if (!done)
-        {
-            g_object_unref(G_OBJECT(instr));
             break;
-        }
 
         gtk_status_stack_update_activity_value(status, id, diff);
 
-        assert(is_range_busy_in_mem_area(area, i, diff));
-
         /* On laisse une chance au code pour se reprendre... */
 
         if (area->is_exec) break;
@@ -2020,6 +2024,8 @@ static void g_area_collector_do_insert(GAreaCollector *collector, GtkStatusStack
     size_t i;                               /* Boucle de parcours #1       */
     GArchInstruction *instr;                /* Instruction à analyser      */
     bool done;                              /* Insertion réalisée ?        */
+    const mrange_t *range;                  /* Emplacement de l'instruction*/
+    VMPA_BUFFER(loc);                       /* Traduction en texte         */
 
     last = NULL;
 
@@ -2030,7 +2036,15 @@ static void g_area_collector_do_insert(GAreaCollector *collector, GtkStatusStack
         done = insert_instr_into_mem_areas(collector->areas, collector->available, instr, &last);
 
         if (!done)
-            g_object_unref(G_OBJECT(instr));
+        {
+            range = g_arch_instruction_get_range(instr);
+            vmpa2_phys_to_string(get_mrange_addr(range), MDS_UNDEFINED, loc, NULL);
+
+            log_variadic_message(LMT_ERROR, "Failed to insert one collected instruction @ %s", loc);
+
+        }
+
+        g_object_unref(G_OBJECT(instr));
 
         gtk_status_stack_update_activity_value(status, collector->id, 1);
 
-- 
cgit v0.11.2-87-g4458