diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c index d48145843..3f86aced5 100644 --- a/coregrind/m_debuginfo/debuginfo.c +++ b/coregrind/m_debuginfo/debuginfo.c @@ -673,7 +673,7 @@ static void check_CFSI_related_invariants ( const DebugInfo* di ) /* invariant (1) */ for (di2 = debugInfo_list; di2; di2 = di2->next) { - if (di2 == di) + if (di2 == di || is_DebugInfo_archived(di2)) continue; for (j = 0; j < VG_(sizeXA)(di2->fsm.maps); j++) { const DebugInfoMapping* map2 = VG_(indexXA)(di2->fsm.maps, j); diff --git a/coregrind/m_debuginfo/priv_storage.h b/coregrind/m_debuginfo/priv_storage.h index 6c471a00f..713acbea8 100644 --- a/coregrind/m_debuginfo/priv_storage.h +++ b/coregrind/m_debuginfo/priv_storage.h @@ -668,7 +668,7 @@ struct _DebugInfo { or the normal case, which is the AND of the following: (0) size of at least one rx mapping > 0 - (1) no two DebugInfos with some rx mapping of size > 0 + (1) no two non-archived DebugInfos with some rx mapping of size > 0 have overlapping rx mappings (2) [cfsi_minavma,cfsi_maxavma] does not extend beyond [avma,+size) of one rx mapping; that is, the former diff --git a/memcheck/tests/linux/dlclose_leak-no-keep.stderr.exp b/memcheck/tests/linux/dlclose_leak-no-keep.stderr.exp index 107b7dd79..01306c0e7 100644 --- a/memcheck/tests/linux/dlclose_leak-no-keep.stderr.exp +++ b/memcheck/tests/linux/dlclose_leak-no-keep.stderr.exp @@ -1,17 +1,17 @@ Conditional jump or move depends on uninitialised value(s) at 0x........: jmp_on_uninit (dlclose_leak_so.c:10) - by 0x........: main (dlclose_leak.c:26) + by 0x........: main (dlclose_leak.c:29) Invalid read of size 1 - at 0x........: main (dlclose_leak.c:29) + at 0x........: main (dlclose_leak.c:32) Address 0x........ is 1 bytes before a block of size 1 alloc'd at 0x........: malloc (vg_replace_malloc.c:...) ... - by 0x........: main (dlclose_leak.c:27) + by 0x........: main (dlclose_leak.c:30) done! -1 bytes in 1 blocks are definitely lost in loss record ... of ... +2 bytes in 2 blocks are definitely lost in loss record ... of ... at 0x........: malloc (vg_replace_malloc.c:...) ... - by 0x........: main (dlclose_leak.c:27) + by 0x........: main (dlclose_leak.c:30) diff --git a/memcheck/tests/linux/dlclose_leak.c b/memcheck/tests/linux/dlclose_leak.c index 33fd2200f..329aaced3 100644 --- a/memcheck/tests/linux/dlclose_leak.c +++ b/memcheck/tests/linux/dlclose_leak.c @@ -9,24 +9,28 @@ int (*jmp_on_uninit)(void); char* (*alloc_1_byte)(void); -int main(int argc, char** argv) { - char* memToLeak; - char x __attribute__((unused)); - void* handle = dlopen("./dlclose_leak_so.so", RTLD_NOW); - if(!handle) { - printf("FAILURE to dlopen dlclose_leak_so.so\n"); - return EXIT_FAILURE; +int main(int argc, char** argv) +{ + for (int i = 0; i < 2; ++i) + { + char* memToLeak; + char x __attribute__((unused)); + void* handle = dlopen("./dlclose_leak_so.so", RTLD_NOW); + if(!handle) { + printf("FAILURE to dlopen dlclose_leak_so.so\n"); + return EXIT_FAILURE; + } + jmp_on_uninit = dlsym(handle,"jmp_on_uninit"); + //fprintf(stderr, "jmp_on_uninit: %p\n", jmp_on_uninit); + assert(jmp_on_uninit); + alloc_1_byte = dlsym(handle,"alloc_1_byte"); + //fprintf(stderr, "alloc_1_byte: %p\n", alloc_1_byte); + assert(alloc_1_byte); + (void)jmp_on_uninit(); + memToLeak = alloc_1_byte(); + dlclose(handle); + x = memToLeak[-1]; } - jmp_on_uninit = dlsym(handle,"jmp_on_uninit"); - //fprintf(stderr, "jmp_on_uninit: %p\n", jmp_on_uninit); - assert(jmp_on_uninit); - alloc_1_byte = dlsym(handle,"alloc_1_byte"); - //fprintf(stderr, "alloc_1_byte: %p\n", alloc_1_byte); - assert(alloc_1_byte); - (void)jmp_on_uninit(); - memToLeak = alloc_1_byte(); - dlclose(handle); - x = memToLeak[-1]; fprintf(stderr, "done!\n"); return (EXIT_SUCCESS); } diff --git a/memcheck/tests/linux/dlclose_leak.stderr.exp b/memcheck/tests/linux/dlclose_leak.stderr.exp index 3c5b44e38..ca89db084 100644 --- a/memcheck/tests/linux/dlclose_leak.stderr.exp +++ b/memcheck/tests/linux/dlclose_leak.stderr.exp @@ -1,17 +1,26 @@ Conditional jump or move depends on uninitialised value(s) at 0x........: jmp_on_uninit (dlclose_leak_so.c:10) - by 0x........: main (dlclose_leak.c:26) + by 0x........: main (dlclose_leak.c:29) Invalid read of size 1 - at 0x........: main (dlclose_leak.c:29) + at 0x........: main (dlclose_leak.c:32) Address 0x........ is 1 bytes before a block of size 1 alloc'd at 0x........: malloc (vg_replace_malloc.c:...) by 0x........: alloc_1_byte (dlclose_leak_so.c:20) - by 0x........: main (dlclose_leak.c:27) + by 0x........: main (dlclose_leak.c:30) + +Conditional jump or move depends on uninitialised value(s) + at 0x........: jmp_on_uninit (dlclose_leak_so.c:10) + by 0x........: main (dlclose_leak.c:29) done! 1 bytes in 1 blocks are definitely lost in loss record ... of ... at 0x........: malloc (vg_replace_malloc.c:...) by 0x........: alloc_1_byte (dlclose_leak_so.c:20) - by 0x........: main (dlclose_leak.c:27) + by 0x........: main (dlclose_leak.c:30) + +1 bytes in 1 blocks are definitely lost in loss record ... of ... + at 0x........: malloc (vg_replace_malloc.c:...) + by 0x........: alloc_1_byte (dlclose_leak_so.c:20) + by 0x........: main (dlclose_leak.c:30)