aboutsummaryrefslogtreecommitdiffstats
path: root/libc/string/memmove.c
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2012-07-12 10:06:27 -0700
committerandroid code review <noreply-gerritcodereview@google.com>2012-07-12 10:06:28 -0700
commit86a4fca0b473c49bcbcf2deb6b5822aa9ab9631e (patch)
tree59b3fd8b76808b6e61bc2fa5853757293e2f8452 /libc/string/memmove.c
parent6334c662cae4cd9b61f5f3185048b0cd3633dad7 (diff)
parente64259e860a84c9527ffbe6d9bd2f6eeab6fdac4 (diff)
downloadandroid_bionic-86a4fca0b473c49bcbcf2deb6b5822aa9ab9631e.tar.gz
android_bionic-86a4fca0b473c49bcbcf2deb6b5822aa9ab9631e.tar.bz2
android_bionic-86a4fca0b473c49bcbcf2deb6b5822aa9ab9631e.zip
Merge "memmove: Don't call memcpy if regions overlap"
Diffstat (limited to 'libc/string/memmove.c')
-rw-r--r--libc/string/memmove.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libc/string/memmove.c b/libc/string/memmove.c
index 072104b6c..fb1d9753e 100644
--- a/libc/string/memmove.c
+++ b/libc/string/memmove.c
@@ -32,10 +32,11 @@ void *memmove(void *dst, const void *src, size_t n)
{
const char *p = src;
char *q = dst;
- /* We can use the optimized memcpy if the destination is below the
- * source (i.e. q < p), or if it is completely over it (i.e. q >= p+n).
+ /* We can use the optimized memcpy if the source and destination
+ * don't overlap.
*/
- if (__builtin_expect((q < p) || ((size_t)(q - p) >= n), 1)) {
+ if (__builtin_expect(((q < p) && ((size_t)(p - q) >= n))
+ || ((p < q) && ((size_t)(q - p) >= n)), 1)) {
return memcpy(dst, src, n);
} else {
bcopy(src, dst, n);