From 761ba27d62a67c098a3323fb37175a7274ee5f19 Mon Sep 17 00:00:00 2001 From: Nick Kralevich Date: Mon, 16 Jul 2012 08:24:32 -0700 Subject: [PATCH] Merge "FORTIFY_SOURCE: revert memcpy changes." --- libc/include/string.h | 10 +--------- libc/string/__memcpy_chk.c | 32 +++----------------------------- 2 files changed, 4 insertions(+), 38 deletions(-) diff --git a/libc/include/string.h b/libc/include/string.h index 8730ea3f4..8e472e7c0 100644 --- a/libc/include/string.h +++ b/libc/include/string.h @@ -93,10 +93,6 @@ extern void __memcpy_src_size_error() __attribute__((__error__("memcpy called with size bigger than source"))); extern void __memcpy_overlap_error() __attribute__((__error__("memcpy called with overlapping regions"))); -extern void *__memcpy_real(void *, const void *, size_t) - __asm__(__USER_LABEL_PREFIX__ "memcpy"); -extern void *__memcpy_chk2(void *, const void *, size_t, size_t, size_t); - __BIONIC_FORTIFY_INLINE void *memcpy (void *dest, const void *src, size_t copy_amount) { @@ -118,11 +114,7 @@ void *memcpy (void *dest, const void *src, size_t copy_amount) { __memcpy_overlap_error(); } - if (__builtin_constant_p(copy_amount) && __builtin_constant_p(d - s)) { - return __memcpy_real(dest, src, copy_amount); - } - - return __memcpy_chk2(dest, src, copy_amount, d_len, s_len); + return __builtin___memcpy_chk(dest, src, copy_amount, d_len); } __BIONIC_FORTIFY_INLINE diff --git a/libc/string/__memcpy_chk.c b/libc/string/__memcpy_chk.c index 934ed673f..10334bab4 100644 --- a/libc/string/__memcpy_chk.c +++ b/libc/string/__memcpy_chk.c @@ -32,7 +32,7 @@ #include /* - * Runtime implementation of __memcpy_chk2. + * Runtime implementation of __memcpy_chk. * * See * http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html @@ -42,12 +42,9 @@ * This memcpy check is called if _FORTIFY_SOURCE is defined and * greater than 0. */ -void *__memcpy_chk2(void *dest, const void *src, - size_t copy_amount, size_t dest_len, size_t src_len) +void *__memcpy_chk(void *dest, const void *src, + size_t copy_amount, size_t dest_len) { - char *d = (char *) dest; - const char *s = (const char *) src; - if (__builtin_expect(copy_amount > dest_len, 0)) { __libc_android_log_print(ANDROID_LOG_FATAL, "libc", "*** memcpy buffer overflow detected ***\n"); @@ -55,28 +52,5 @@ void *__memcpy_chk2(void *dest, const void *src, abort(); } - if (__builtin_expect(copy_amount > src_len, 0)) { - __libc_android_log_print(ANDROID_LOG_FATAL, "libc", - "*** memcpy read overflow detected ***\n"); - abort(); - } - - if (__builtin_expect(((d <= s) && ((size_t)(s - d) < copy_amount)) - || ((d >= s) && ((size_t)(d - s) < copy_amount)), 0)) { - __libc_android_log_print(ANDROID_LOG_FATAL, "libc", - "*** memcpy memory overlap detected ***\n"); - abort(); - } - return memcpy(dest, src, copy_amount); } - -/* - * GCC can create references to __memcpy_chk when using - * __builtin__memmove_chk(). - */ -void *__memcpy_chk(void *dest, const void *src, - size_t copy_amount, size_t dest_len) -{ - return __memcpy_chk2(dest, src, copy_amount, dest_len, (size_t) -1); -}