From: Nicholas Nethercote Date: Wed, 5 May 2004 10:46:22 +0000 (+0000) Subject: Fix for bug #80942. X-Git-Tag: svn/VALGRIND_2_1_2~113 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=874fc865a44beb0fcd30ea268ea1bdf013d7ad67;p=thirdparty%2Fvalgrind.git Fix for bug #80942. Addrcheck wasn't doing overlap checking as it should. This is because mac_replace_strmem.o was being linked with vgskin_addrcheck.so instead of vgpreload_addrcheck.so. I fixed the Makefile, and also moved _VG_USERREQ__MEMCHECK_GET_RECORD_OVERLAP so Addrcheck could see it. And I added the 'overlap' test (from memcheck/tests/) to Addrcheck's regression suite. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2394 --- diff --git a/addrcheck/Makefile.am b/addrcheck/Makefile.am index 4c12457566..3c86d5bac0 100644 --- a/addrcheck/Makefile.am +++ b/addrcheck/Makefile.am @@ -17,12 +17,15 @@ vgskin_addrcheck_so_LDFLAGS = -shared vgskin_addrcheck_so_LDADD = \ ../memcheck/mac_leakcheck.o \ ../memcheck/mac_malloc_wrappers.o \ - ../memcheck/mac_needs.o \ - ../memcheck/mac_replace_strmem.o + ../memcheck/mac_needs.o vgpreload_addrcheck_so_SOURCES = -vgpreload_addrcheck_so_LDADD = $(top_builddir)/coregrind/vg_replace_malloc.o -vgpreload_addrcheck_so_DEPENDENCIES = $(top_builddir)/coregrind/vg_replace_malloc.o +vgpreload_addrcheck_so_LDADD = \ + $(top_builddir)/coregrind/vg_replace_malloc.o \ + ../memcheck/mac_replace_strmem.o +vgpreload_addrcheck_so_DEPENDENCIES = \ + $(top_builddir)/coregrind/vg_replace_malloc.o \ + ../memcheck/mac_replace_strmem.o vgpreload_addrcheck_so_LDFLAGS = -shared -Wl,-z,interpose,-z,initfirst all-local: diff --git a/addrcheck/tests/Makefile.am b/addrcheck/tests/Makefile.am index 7eca180f7a..a05a457317 100644 --- a/addrcheck/tests/Makefile.am +++ b/addrcheck/tests/Makefile.am @@ -8,4 +8,5 @@ EXTRA_DIST = $(noinst_SCRIPTS) \ insn_basic.vgtest insn_cmov.vgtest insn_mmx.vgtest \ $(addsuffix .stderr.exp,$(INSN_TESTS)) \ $(addsuffix .stdout.exp,$(INSN_TESTS)) \ - $(addsuffix .vgtest,$(INSN_TESTS)) + $(addsuffix .vgtest,$(INSN_TESTS)) \ + overlap.stderr.exp overlap.stdout.exp overlap.vgtest diff --git a/addrcheck/tests/overlap.stderr.exp b/addrcheck/tests/overlap.stderr.exp new file mode 100644 index 0000000000..6fcbcd1ca5 --- /dev/null +++ b/addrcheck/tests/overlap.stderr.exp @@ -0,0 +1,27 @@ +Source and destination overlap in memcpy(0x........, 0x........, 21) + at 0x........: memcpy (mac_replace_strmem.c:...) + by 0x........: main (overlap.c:40) + +Source and destination overlap in memcpy(0x........, 0x........, 21) + at 0x........: memcpy (mac_replace_strmem.c:...) + by 0x........: main (overlap.c:42) + +Source and destination overlap in strncpy(0x........, 0x........, 21) + at 0x........: strncpy (mac_replace_strmem.c:...) + by 0x........: main (overlap.c:45) + +Source and destination overlap in strncpy(0x........, 0x........, 21) + at 0x........: strncpy (mac_replace_strmem.c:...) + by 0x........: main (overlap.c:47) + +Source and destination overlap in strcpy(0x........, 0x........) + at 0x........: strcpy (mac_replace_strmem.c:...) + by 0x........: main (overlap.c:54) + +Source and destination overlap in strncat(0x........, 0x........, 21) + at 0x........: strncat (mac_replace_strmem.c:...) + by 0x........: main (overlap.c:112) + +Source and destination overlap in strncat(0x........, 0x........, 21) + at 0x........: strncat (mac_replace_strmem.c:...) + by 0x........: main (overlap.c:113) diff --git a/addrcheck/tests/overlap.stdout.exp b/addrcheck/tests/overlap.stdout.exp new file mode 100644 index 0000000000..12cb02e548 --- /dev/null +++ b/addrcheck/tests/overlap.stdout.exp @@ -0,0 +1,11 @@ +`_________________________________________________' +`abcdefghijklmnopqrstuvwxyz' +`abcdefghijklmnopqrstuvwxy________________________' +`abcdefghijklmnopqrstuvwxyz_______________________' +`abcdefghijklmnopqrstuvwxyz' + +`ABCDEFG' +`ABCDEFGabcdefghijklmnopqrstuvwxyz' +`ABCDEFGabcdefghijklmnopqrstuvwxy' +`ABCDEFGabcdefghijklmnopqrstuvwxyz' +`ABCDEFGabcdefghijklmnopqrstuvwxyz' diff --git a/addrcheck/tests/overlap.vgtest b/addrcheck/tests/overlap.vgtest new file mode 100644 index 0000000000..da96655baf --- /dev/null +++ b/addrcheck/tests/overlap.vgtest @@ -0,0 +1,2 @@ +vgopts: -q +prog: ../../memcheck/tests/overlap diff --git a/memcheck/mac_needs.c b/memcheck/mac_needs.c index 243b163a00..3c7c616a5f 100644 --- a/memcheck/mac_needs.c +++ b/memcheck/mac_needs.c @@ -873,6 +873,10 @@ Bool MAC_(handle_common_client_requests)(ThreadId tid, UInt* arg, UInt* ret ) return True; } + case _VG_USERREQ__MEMCHECK_GET_RECORD_OVERLAP: + *ret = (Addr)MAC_(record_overlap_error); + return True; + default: return False; } diff --git a/memcheck/mc_clientreqs.c b/memcheck/mc_clientreqs.c index 54ab99bffe..9f383f6eaf 100644 --- a/memcheck/mc_clientreqs.c +++ b/memcheck/mc_clientreqs.c @@ -232,10 +232,6 @@ Bool SK_(handle_client_request) ( ThreadId tid, UInt* arg, UInt* ret ) ( tid, arg[1], arg[2], arg[3], True /* set them */ ); break; - case _VG_USERREQ__MEMCHECK_GET_RECORD_OVERLAP: - *ret = (Addr)MAC_(record_overlap_error); - break; - default: if (MAC_(handle_common_client_requests)(tid, arg, ret )) { return True;