From 0c69daa2ab4a3b7d034934a2a2d53138b9333f06 Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Tue, 18 Mar 2014 12:51:30 +0100 Subject: [PATCH] [mc] Fix mismatch between expected snapshot address and passed process address Function 'compare_areas_with_type' expects snapshot addresses but was passed process/real addresses in a recursive call. It is very easy to mix the two types of addresses :/ --- src/mc/mc_compare.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/mc/mc_compare.c b/src/mc/mc_compare.c index 4bb3b2d1af..b2be1fd2ff 100644 --- a/src/mc/mc_compare.c +++ b/src/mc/mc_compare.c @@ -166,13 +166,13 @@ static int compare_areas_with_type(void *area1, void *area2, mc_snapshot_t snaps case DW_TAG_pointer_type: case DW_TAG_reference_type: case DW_TAG_rvalue_reference_type: + + addr_pointed1 = *((void **)(area1)); + addr_pointed2 = *((void **)(area2)); + if(type->subtype && type->subtype->type == DW_TAG_subroutine_type){ - addr_pointed1 = *((void **)(area1)); - addr_pointed2 = *((void **)(area2)); return (addr_pointed1 != addr_pointed2); }else{ - addr_pointed1 = *((void **)(area1)); - addr_pointed2 = *((void **)(area2)); if(addr_pointed1 == NULL && addr_pointed2 == NULL) return 0; @@ -199,8 +199,12 @@ static int compare_areas_with_type(void *area1, void *area2, mc_snapshot_t snaps return 1; if(type->dw_type_id == NULL) return (addr_pointed1 != addr_pointed2); - else - return compare_areas_with_type(addr_pointed1, addr_pointed2, snapshot1, snapshot2, info, other_info, type->subtype, region_size, region_type, start_data, pointer_level); + else { + void* translated_addr_pointer1 = mc_translate_address((uintptr_t)addr_pointed1, snapshot1); + void* translated_addr_pointer2 = mc_translate_address((uintptr_t)addr_pointed2, snapshot2); + return compare_areas_with_type( + translated_addr_pointer1, translated_addr_pointer2, snapshot1, snapshot2, info, other_info, type->subtype, region_size, region_type, start_data, pointer_level); + } } else{ -- 2.20.1