diff options
author | Nick Kralevich <nnk@google.com> | 2012-07-12 10:06:27 -0700 |
---|---|---|
committer | android code review <noreply-gerritcodereview@google.com> | 2012-07-12 10:06:28 -0700 |
commit | 86a4fca0b473c49bcbcf2deb6b5822aa9ab9631e (patch) | |
tree | 59b3fd8b76808b6e61bc2fa5853757293e2f8452 /libc/string/memmove.c | |
parent | 6334c662cae4cd9b61f5f3185048b0cd3633dad7 (diff) | |
parent | e64259e860a84c9527ffbe6d9bd2f6eeab6fdac4 (diff) | |
download | android_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.c | 7 |
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); |