From 499f00977cd7f50ce0c4cf24dd59b1e920e5b180 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 15 Mar 2017 19:17:57 +0100
Subject: Checked the remaining space before inserting new instructions.

---
 ChangeLog                  |  5 +++++
 src/analysis/disass/area.c | 24 ++++++++++++++++++++----
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d4f605c..b309cc1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 17-03-15  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/analysis/disass/area.c:
+	Check the remaining space before inserting new instructions.
+
+17-03-15  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/arch/arm/v7/fetch.c:
 	* src/arch/arm/v7/link.c:
 	Update code.
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index 6698bb3..bdfb1b2 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -407,7 +407,25 @@ static GArchInstruction *load_raw_instruction_from_mem_area(mem_area *area, phys
 
     sz = area->packing_size;
 
-    if (get_virt_addr(pos) % sz == 0 && is_range_blank_in_mem_area(area, offset, sz))
+    /**
+     * Une vérification est effectuée en amont pour garantir qu'il existe
+     * toujours au moins un octet à traiter.
+     *
+     * Si on veut en manipuler plus d'un, aucune vérification en amont ne s'occupe
+     * du cas où on dépasse les limites de la zone lors des tests de marquage.
+     *
+     * D'habitude, c'est la création préalable d'une instruction, via la lecture
+     * du contenu binaire restreint, qui part en échec et qui fait qu'on ne teste
+     * pas la zone sur un espace hors champ.
+     *
+     * Ce test est effectué avant la création d'une instruction ici (et c'est le
+     * seul endroit dans ce cas de figure), donc il faut faire les vérifications
+     * de débordement avant tout !
+     */
+
+    if (get_virt_addr(pos) % sz == 0
+        && (offset + sz) <= get_mrange_length(&area->range)
+        && is_range_blank_in_mem_area(area, offset, sz))
     {
         *size = sz;
 
@@ -697,12 +715,10 @@ static void load_data_from_mem_area(mem_area *area, GProcContext *ctx, const vmp
         if (!is_range_blank_in_mem_area(area, i, 1))
             break;
 
-        instr = NULL;
+        /* Décodage d'une nouvelle instruction, sur mesure puis minimale */
 
         copy_vmpa(&prev, &pos);
 
-        /* Décodage d'une nouvelle instruction, sur mesure puis minimale */
-
         instr = load_raw_instruction_from_mem_area(area, i, &pos, &diff);
 
         /* On rencontre ici un morceau déjà traité. */
-- 
cgit v0.11.2-87-g4458