|
From: <sv...@va...> - 2005-09-18 10:07:54
|
Author: sewardj
Date: 2005-09-18 11:07:51 +0100 (Sun, 18 Sep 2005)
New Revision: 4676
Log:
Make mc_copy_address_range_state safe in the presence of overlaps.
Modified:
branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c
branches/ASPACEM/coregrind/pub_core_tooliface.h
branches/ASPACEM/memcheck/mc_main.c
Modified: branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c 2005-09-18 09:45:3=
3 UTC (rev 4675)
+++ branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c 2005-09-18 10:07:5=
1 UTC (rev 4676)
@@ -1391,7 +1391,7 @@
=20
#define AM_SANITY_CHECK \
do { \
- if (VG_(clo_sanity_level > 1)) \
+ if (VG_(clo_sanity_level >=3D 3)) \
aspacem_assert(do_sync_check(__PRETTY_FUNCTION__, \
__FILE__,__LINE__)); \
} while (0)=20
@@ -1971,6 +1971,16 @@
"sync check at %s:%d (%s): FAILED\n",
file, line, fn);
VG_(debugLog)(0,"aspacem", "\n");
+
+# if 0
+ {
+ HChar buf[100];
+ VG_(am_show_nsegments)(0,"post segfault");
+ VG_(sprintf)(buf, "/bin/cat /proc/%d/maps", VG_(getpid)());
+ VG_(system)(buf);
+ }
+# endif
+
}
return sync_check_ok;
}
Modified: branches/ASPACEM/coregrind/pub_core_tooliface.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/coregrind/pub_core_tooliface.h 2005-09-18 09:45:33 U=
TC (rev 4675)
+++ branches/ASPACEM/coregrind/pub_core_tooliface.h 2005-09-18 10:07:51 U=
TC (rev 4676)
@@ -158,7 +158,7 @@
void (*track_new_mem_brk) (Addr, SizeT);
void (*track_new_mem_mmap) (Addr, SizeT, Bool, Bool, Bool);
=20
- void (*track_copy_mem_remap) (Addr, Addr, SizeT);
+ void (*track_copy_mem_remap) (Addr src, Addr dst, SizeT);
void (*track_change_mem_mprotect) (Addr, SizeT, Bool, Bool, Bool);
void (*track_die_mem_stack_signal)(Addr, SizeT);
void (*track_die_mem_brk) (Addr, SizeT);
Modified: branches/ASPACEM/memcheck/mc_main.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/memcheck/mc_main.c 2005-09-18 09:45:33 UTC (rev 4675=
)
+++ branches/ASPACEM/memcheck/mc_main.c 2005-09-18 10:07:51 UTC (rev 4676=
)
@@ -738,21 +738,35 @@
}
=20
=20
-/* --- Block-copy permissions (needed for implementing realloc()). --- *=
/
+/* --- Block-copy permissions (needed for implementing realloc() and
+ sys_mremap). --- */
=20
static void mc_copy_address_range_state ( Addr src, Addr dst, SizeT len =
)
{
- SizeT i;
+ SizeT i, j;
UWord abit, vbyte;
=20
DEBUG("mc_copy_address_range_state\n");
+ PROF_EVENT(50, "mc_copy_address_range_state");
=20
- PROF_EVENT(50, "mc_copy_address_range_state");
- for (i =3D 0; i < len; i++) {
- PROF_EVENT(51, "mc_copy_address_range_state(loop)");
- get_abit_and_vbyte( &abit, &vbyte, src+i );
- set_abit_and_vbyte( dst+i, abit, vbyte );
+ if (len =3D=3D 0)
+ return;
+
+ if (src < dst) {
+ for (i =3D 0, j =3D len-1; i < len; i++, j--) {
+ PROF_EVENT(51, "mc_copy_address_range_state(loop)");
+ get_abit_and_vbyte( &abit, &vbyte, src+j );
+ set_abit_and_vbyte( dst+j, abit, vbyte );
+ }
}
+
+ if (src > dst) {
+ for (i =3D 0; i < len; i++) {
+ PROF_EVENT(51, "mc_copy_address_range_state(loop)");
+ get_abit_and_vbyte( &abit, &vbyte, src+i );
+ set_abit_and_vbyte( dst+i, abit, vbyte );
+ }
+ }
}
=20
=20
|