From: Julian Seward Date: Sun, 31 Dec 2006 18:55:56 +0000 (+0000) Subject: Provide a replacement for mempcpy. X-Git-Tag: svn/VALGRIND_3_3_0~446 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20b41c0c23d1c7fb7d73ee48c04c0465b716afa5;p=thirdparty%2Fvalgrind.git Provide a replacement for mempcpy. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6469 --- diff --git a/memcheck/mc_replace_strmem.c b/memcheck/mc_replace_strmem.c index f4aefcd0ab..69fb91f534 100644 --- a/memcheck/mc_replace_strmem.c +++ b/memcheck/mc_replace_strmem.c @@ -558,6 +558,42 @@ GLIBC232_RAWMEMCHR(m_libc_soname, rawmemchr) GLIBC25___STRCPY_CHK(m_libc_soname, __strcpy_chk) +/* mempcpy */ +#define GLIBC25_MEMPCPY(soname, fnname) \ + void* VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( void *dst, const void *src, SizeT len ); \ + void* VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( void *dst, const void *src, SizeT len ) \ + { \ + register char *d; \ + register char *s; \ + SizeT len_saved = len; \ + \ + if (len == 0) \ + return dst; \ + \ + if (is_overlap(dst, src, len, len)) \ + RECORD_OVERLAP_ERROR("mempcpy", dst, src, len); \ + \ + if ( dst > src ) { \ + d = (char *)dst + len - 1; \ + s = (char *)src + len - 1; \ + while ( len-- ) { \ + *d-- = *s--; \ + } \ + } else if ( dst < src ) { \ + d = (char *)dst; \ + s = (char *)src; \ + while ( len-- ) { \ + *d++ = *s++; \ + } \ + } \ + return (void*)( ((char*)dst) + len_saved ); \ + } + +GLIBC25_MEMPCPY(m_libc_soname, mempcpy) + + /*------------------------------------------------------------*/ /*--- AIX stuff only after this point ---*/ /*------------------------------------------------------------*/