From e441c2320666df295eaecc385740f40acbd2afbe Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Thu, 24 May 2018 10:14:00 +0200
Subject: Handled null virtual addresses with more care.

---
 plugins/elf/section.c     | 22 +++++++++++++++++++++-
 src/glibext/gbinportion.c |  9 ++++++---
 2 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/plugins/elf/section.c b/plugins/elf/section.c
index 0e2fd3e..0758693 100644
--- a/plugins/elf/section.c
+++ b/plugins/elf/section.c
@@ -202,8 +202,21 @@ void get_elf_section_content(const GElfFormat *format, const elf_shdr *section,
         *size = ELF_SHDR(format, *section, sh_size);
 
     if (addr != NULL)
+    {
         *addr = ELF_SHDR(format, *section, sh_addr);
 
+        if (*addr == 0)
+        {
+            if (ELF_HDR(format, format->header, e_type) == ET_REL
+                || (ELF_SHDR(format, *section, sh_flags) & SHF_ALLOC) == 0)
+            {
+                *addr = VMPA_NO_VIRTUAL;
+            }
+
+        }
+
+    }
+
 }
 
 
@@ -229,7 +242,14 @@ void get_elf_section_range(const GElfFormat *format, const elf_shdr *section, mr
     virt = ELF_SHDR(format, *section, sh_addr);
 
     if (virt == 0)
-        virt = VMPA_NO_VIRTUAL;
+    {
+        if (ELF_HDR(format, format->header, e_type) == ET_REL
+            || (ELF_SHDR(format, *section, sh_flags) & SHF_ALLOC) == 0)
+        {
+            virt = VMPA_NO_VIRTUAL;
+        }
+
+    }
 
     init_vmpa(&tmp, ELF_SHDR(format, *section, sh_offset), virt);
 
diff --git a/src/glibext/gbinportion.c b/src/glibext/gbinportion.c
index ab5fa6e..ff5ff7d 100644
--- a/src/glibext/gbinportion.c
+++ b/src/glibext/gbinportion.c
@@ -1216,14 +1216,17 @@ GBinPortion *g_binary_portion_find_at_pos(GBinPortion *portion, gint x, GdkRecta
 static bool g_binary_portion_contains_vmpa(const GBinPortion *portion, const vmpa2t *addr)
 {
     bool result;                            /* Bilan à retourner           */
+    const mrange_t *range;                  /* Emplacement de portion      */
 
     result = false;
 
-    /* Portion non allouée en mémoire -> adresse nulle ; on écarte */
-    if (get_virt_addr(get_mrange_addr(&portion->range)) == 0)
+    range = g_binary_portion_get_range(portion);
+
+    /* Portion non allouée en mémoire : on écarte */
+    if (!has_virt_addr(get_mrange_addr(range)))
         goto not_found;
 
-    result = mrange_contains_addr(&portion->range, addr);
+    result = mrange_contains_addr(range, addr);
 
  not_found:
 
-- 
cgit v0.11.2-87-g4458