From 4cb951158da6d1094d385fa710a61d192cc1667e Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Fri, 23 Feb 2007 09:03:26 +0000 Subject: [PATCH] Add an intercept for __memmove_chk (another glibc 2.5 artefact) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6608 --- memcheck/mc_replace_strmem.c | 40 ++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/memcheck/mc_replace_strmem.c b/memcheck/mc_replace_strmem.c index efd64687cd..29a56d39c8 100644 --- a/memcheck/mc_replace_strmem.c +++ b/memcheck/mc_replace_strmem.c @@ -509,6 +509,40 @@ MEMSET(m_libc_soname, memset) MEMMOVE(m_libc_soname, memmove) +/* glibc 2.5 variant of memmove which checks the dest is big enough. + There is no specific part of glibc that this is copied from. */ +#define GLIBC25___MEMMOVE_CHK(soname, fnname) \ + void* VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + (void *dstV, const void *srcV, SizeT n, SizeT destlen); \ + void* VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + (void *dstV, const void *srcV, SizeT n, SizeT destlen) \ + { \ + extern void _exit(int status); \ + SizeT i; \ + Char* dst = (Char*)dstV; \ + Char* src = (Char*)srcV; \ + if (destlen < n) \ + goto badness; \ + if (dst < src) { \ + for (i = 0; i < n; i++) \ + dst[i] = src[i]; \ + } \ + else \ + if (dst > src) { \ + for (i = 0; i < n; i++) \ + dst[n-i-1] = src[n-i-1]; \ + } \ + return dst; \ + badness: \ + VALGRIND_PRINTF_BACKTRACE( \ + "*** memmove_chk: buffer overflow detected ***: " \ + "program terminated"); \ + _exit(127); \ + } + +GLIBC25___MEMMOVE_CHK(m_libc_soname, __memmove_chk) + + /* Find the first occurrence of C in S or the final NUL byte. */ #define GLIBC232_STRCHRNUL(soname, fnname) \ char* VG_REPLACE_FUNCTION_ZU(soname,fnname) (const char* s, int c_in); \ @@ -560,7 +594,8 @@ GLIBC232_RAWMEMCHR(m_libc_soname, rawmemchr) return ret; \ badness: \ VALGRIND_PRINTF_BACKTRACE( \ - "***buffer overflow detected ***: program terminated"); \ + "*** strcpy_chk: buffer overflow detected ***: " \ + "program terminated"); \ _exit(127); \ /*NOTREACHED*/ \ return NULL; \ @@ -586,7 +621,8 @@ GLIBC25___STRCPY_CHK(m_libc_soname, __strcpy_chk) return dst - 1; \ badness: \ VALGRIND_PRINTF_BACKTRACE( \ - "***buffer overflow detected ***: program terminated"); \ + "*** stpcpy_chk: buffer overflow detected ***: " \ + "program terminated"); \ _exit(127); \ /*NOTREACHED*/ \ return NULL; \ -- 2.47.2