From 71a18dd435e96564539b5af71b8ea5093a2109a1 Mon Sep 17 00:00:00 2001 From: Nick Kralevich Date: Thu, 7 Jun 2012 14:01:26 -0700 Subject: [PATCH] _FORTIFY_SOURCE: add memset / bzero support Add _FORTIFY_SOURCE support for the following functions: * memset * bzero Move the __BIONIC_FORTIFY_INLINE definition to cdefs.h so it can be used from multiple header files. Change-Id: Iead4d5e35de6ec97786d58ee12573f9b11135bb7 --- libc/Android.mk | 1 + libc/include/string.h | 24 ++++++++++----------- libc/include/strings.h | 8 +++++++ libc/include/sys/cdefs.h | 8 +++++++ libc/string/__memset_chk.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 libc/string/__memset_chk.c diff --git a/libc/Android.mk b/libc/Android.mk index 596a85692..70a52439f 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -207,6 +207,7 @@ libc_common_src_files := \ string/strxfrm.c \ string/__memcpy_chk.c \ string/__memmove_chk.c \ + string/__memset_chk.c \ string/__strcat_chk.c \ string/__strcpy_chk.c \ string/__strncat_chk.c \ diff --git a/libc/include/string.h b/libc/include/string.h index 12c950003..e1718e97a 100644 --- a/libc/include/string.h +++ b/libc/include/string.h @@ -85,27 +85,21 @@ extern char* strsignal(int sig); extern int strcoll(const char *, const char *) __purefunc; extern size_t strxfrm(char *, const char *, size_t); -#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 - -#define __BIONIC_FORTIFY_INLINE \ - extern inline \ - __attribute__ ((always_inline)) \ - __attribute__ ((gnu_inline)) \ - __attribute__ ((artificial)) +#if defined(__BIONIC_FORTIFY_INLINE) __BIONIC_FORTIFY_INLINE void *memcpy (void *dest, const void *src, size_t len) { - return __builtin___memcpy_chk (dest, src, len, __builtin_object_size (dest, 0)); + return __builtin___memcpy_chk(dest, src, len, __builtin_object_size (dest, 0)); } __BIONIC_FORTIFY_INLINE void *memmove (void *dest, const void *src, size_t len) { - return __builtin___memmove_chk (dest, src, len, __builtin_object_size (dest, 0)); + return __builtin___memmove_chk(dest, src, len, __builtin_object_size (dest, 0)); } __BIONIC_FORTIFY_INLINE char *strcpy(char *dest, const char *src) { - return __builtin___strcpy_chk (dest, src, __builtin_object_size (dest, 0)); + return __builtin___strcpy_chk(dest, src, __builtin_object_size (dest, 0)); } __BIONIC_FORTIFY_INLINE @@ -115,7 +109,7 @@ char *strncpy(char *dest, const char *src, size_t n) { __BIONIC_FORTIFY_INLINE char *strcat(char *dest, const char *src) { - return __builtin___strcat_chk (dest, src, __builtin_object_size (dest, 0)); + return __builtin___strcat_chk(dest, src, __builtin_object_size (dest, 0)); } __BIONIC_FORTIFY_INLINE @@ -123,8 +117,12 @@ char *strncat(char *dest, const char *src, size_t n) { return __builtin___strncat_chk(dest, src, n, __builtin_object_size (dest, 0)); } -#undef __BIONIC_FORTIFY_INLINE -#endif +__BIONIC_FORTIFY_INLINE +void *memset (void *s, int c, size_t n) { + return __builtin___memset_chk(s, c, n, __builtin_object_size (s, 0)); +} + +#endif /* defined(__BIONIC_FORTIFY_INLINE) */ __END_DECLS diff --git a/libc/include/strings.h b/libc/include/strings.h index fee7dc4f7..db2aa3a10 100644 --- a/libc/include/strings.h +++ b/libc/include/strings.h @@ -51,6 +51,14 @@ char *index(const char *, int); char *rindex(const char *, int); int strcasecmp(const char *, const char *); int strncasecmp(const char *, const char *, size_t); + +#if defined(__BIONIC_FORTIFY_INLINE) +__BIONIC_FORTIFY_INLINE +void bzero (void *s, size_t n) { + __builtin___memset_chk(s, '\0', n, __builtin_object_size (s, 0)); +} +#endif /* defined(__BIONIC_FORTIFY_INLINE) */ + __END_DECLS #endif /* !defined(_STRINGS_H_) */ diff --git a/libc/include/sys/cdefs.h b/libc/include/sys/cdefs.h index 71b419ce4..1ba9100b9 100644 --- a/libc/include/sys/cdefs.h +++ b/libc/include/sys/cdefs.h @@ -501,4 +501,12 @@ #define __BIONIC__ 1 #include +#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 +#define __BIONIC_FORTIFY_INLINE \ + extern inline \ + __attribute__ ((always_inline)) \ + __attribute__ ((gnu_inline)) \ + __attribute__ ((artificial)) +#endif + #endif /* !_SYS_CDEFS_H_ */ diff --git a/libc/string/__memset_chk.c b/libc/string/__memset_chk.c new file mode 100644 index 000000000..1ccfd460e --- /dev/null +++ b/libc/string/__memset_chk.c @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +/* + * Runtime implementation of __builtin____memset_chk. + * + * See + * http://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html + * http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html + * for details. + * + * This memset check is called if _FORTIFY_SOURCE is defined and + * greater than 0. + */ +void *__memset_chk (void *dest, int c, size_t n, size_t dest_len) +{ + if (n > dest_len) { + __libc_android_log_print(ANDROID_LOG_FATAL, "libc", + "*** memset buffer overflow detected ***\n"); + abort(); + } + + return memset(dest, c, n); +} -- 2.11.0