From f28a023c99c144b7e47954323f18c3df05294242 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 19 Feb 2000 17:18:34 +0000 Subject: [PATCH] Fixed a bug - memmove() couldn't handle overlapping buffers svn path=/trunk/; revision=990 --- reactos/lib/ntdll/string/memmove.c | 30 ++++++++++++++++++++++++------ reactos/ntoskrnl/rtl/memmove.c | 29 +++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 12 deletions(-) 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;