summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/disass/area.c24
1 files changed, 20 insertions, 4 deletions
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é. */