From d2e0015ab754df537470fa79b7991c9f7b040600 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 14 May 1999 13:30:07 +0000 Subject: [PATCH] Fixed overlapping buffer handling. svn path=/trunk/; revision=465 --- reactos/lib/crtdll/string/memmove.c | 36 +++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/reactos/lib/crtdll/string/memmove.c b/reactos/lib/crtdll/string/memmove.c index d8af46e554b..3315e10d8c9 100644 --- a/reactos/lib/crtdll/string/memmove.c +++ b/reactos/lib/crtdll/string/memmove.c @@ -3,18 +3,34 @@ void * memmove(void *dest,const void *src,size_t count) { - char *char_dest = (char *)dest; - char *char_src = (char *)src; + char *char_dest = (char *)dest; + char *char_src = (char *)src; - while(count > 0 ) + if ((char_dest <= char_src) || (char_dest >= (char_src+count))) + { + /* non-overlapping buffers */ + while(count > 0) { - *char_dest = *char_src; - char_dest++; - char_src++; - count--; + *char_dest = *char_src; + char_dest++; + char_src++; + count--; } + } + else + { + /* overlaping buffers */ + char_dest = (char *)dest + count - 1; + char_src = (char *)src + count - 1; - return dest; - - + while(count > 0) + { + *char_dest = *char_src; + char_dest--; + char_src--; + count--; + } + } + + return dest; }