diff --git a/reactos/lib/ntdll/string/memmove.c b/reactos/lib/ntdll/string/memmove.c index 11038c606fb..0a0b81f5802 100644 --- a/reactos/lib/ntdll/string/memmove.c +++ b/reactos/lib/ntdll/string/memmove.c @@ -1,18 +1,36 @@ #include - void * memmove(void *dest,const void *src,size_t count) { char *char_dest = (char *)dest; char *char_src = (char *)src; - while(count > 0 ) + if ((char_dest <= char_src) || (char_dest >= (char_src+count))) { - *char_dest = *char_src; - char_dest++; - char_src++; - count--; + /* non-overlapping buffers */ + while(count > 0) + { + *char_dest = *char_src; + char_dest++; + char_src++; + count--; + } + } + else + { + /* overlaping buffers */ + char_dest = (char *)dest + count - 1; + char_src = (char *)src + count - 1; + + while(count > 0) + { + *char_dest = *char_src; + char_dest--; + char_src--; + count--; + } } return dest; } + diff --git a/reactos/ntoskrnl/rtl/memmove.c b/reactos/ntoskrnl/rtl/memmove.c index 11038c606fb..f15f6bb58b5 100644 --- a/reactos/ntoskrnl/rtl/memmove.c +++ b/reactos/ntoskrnl/rtl/memmove.c @@ -1,17 +1,34 @@ #include - void * memmove(void *dest,const void *src,size_t count) { char *char_dest = (char *)dest; char *char_src = (char *)src; - while(count > 0 ) + if ((char_dest <= char_src) || (char_dest >= (char_src+count))) { - *char_dest = *char_src; - char_dest++; - char_src++; - count--; + /* non-overlapping buffers */ + while(count > 0) + { + *char_dest = *char_src; + char_dest++; + char_src++; + count--; + } + } + else + { + /* overlaping buffers */ + char_dest = (char *)dest + count - 1; + char_src = (char *)src + count - 1; + + while(count > 0) + { + *char_dest = *char_src; + char_dest--; + char_src--; + count--; + } } return dest;