Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix bug mc_snapshot_read_fragmented
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 19 Jun 2014 10:43:22 +0000 (12:43 +0200)
committerGabriel Corona <gabriel.corona@loria.fr>
Thu, 19 Jun 2014 10:43:22 +0000 (12:43 +0200)
Return the correct address.

src/mc/mc_mmu.h
src/mc/mc_snapshot.c

index dd6f2da..0fe1715 100644 (file)
@@ -33,6 +33,7 @@ static inline size_t mc_page_count(size_t size)
  */
 static inline size_t mc_page_number(void* base, void* address)
 {
+  xbt_assert(address>=base, "The address is not in the range");
   return ((uintptr_t) address - (uintptr_t) base) >> xbt_pagebits;
 }
 
index c3eb07c..8bf1279 100644 (file)
@@ -24,6 +24,8 @@ mc_mem_region_t mc_get_snapshot_region(void* addr, mc_snapshot_t snapshot)
 
 void* mc_translate_address_region(uintptr_t addr, mc_mem_region_t region)
 {
+  xbt_assert(mc_region_contain(region, (void*) addr), "Trying to read out of the region boundary.");
+
   if (!region) {
     return (void *) addr;
   }
@@ -71,21 +73,22 @@ static void* mc_snapshot_read_fragmented(void* addr, mc_mem_region_t region, voi
 {
   void* end = (char*) addr + size - 1;
   size_t page_end = mc_page_number(NULL, end);
+  void* dest = target;
 
   // Read each page:
   while (mc_page_number(NULL, addr) != page_end) {
     void* snapshot_addr = mc_translate_address_region((uintptr_t) addr, region);
     void* next_page = mc_page_from_number(NULL, mc_page_number(NULL, addr) + 1);
     size_t readable = (char*) next_page - (char*) addr;
-    memcpy(target, snapshot_addr, readable);
+    memcpy(dest, snapshot_addr, readable);
     addr = (char*) addr + readable;
-    target = (char*) target + readable;
+    dest = (char*) dest + readable;
     size -= readable;
   }
 
   // Read the end:
   void* snapshot_addr = mc_translate_address_region((uintptr_t)addr, region);
-  memcpy(target, snapshot_addr, size);
+  memcpy(dest, snapshot_addr, size);
 
   return target;
 }