summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2012-06-07 14:01:26 -0700
committerNick Kralevich <nnk@google.com>2012-06-07 14:19:52 -0700
commit71a18dd435e96564539b5af71b8ea5093a2109a1 (patch)
treefd59c2a7cc23b663d090b0b8843a5d19c97df7d0
parent7d11009a970732ea18f8a0599d63c94eab9ec3f0 (diff)
downloadbionic-71a18dd435e96564539b5af71b8ea5093a2109a1.zip
bionic-71a18dd435e96564539b5af71b8ea5093a2109a1.tar.gz
bionic-71a18dd435e96564539b5af71b8ea5093a2109a1.tar.bz2
_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
-rw-r--r--libc/Android.mk1
-rw-r--r--libc/include/string.h24
-rw-r--r--libc/include/strings.h8
-rw-r--r--libc/include/sys/cdefs.h8
-rw-r--r--libc/string/__memset_chk.c53
5 files changed, 81 insertions, 13 deletions
diff --git a/libc/Android.mk b/libc/Android.mk
index 596a856..70a5243 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 12c9500..e1718e9 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 fee7dc4..db2aa3a 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 71b419c..1ba9100 100644
--- a/libc/include/sys/cdefs.h
+++ b/libc/include/sys/cdefs.h
@@ -501,4 +501,12 @@
#define __BIONIC__ 1
#include <android/api-level.h>
+#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 0000000..1ccfd46
--- /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 <string.h>
+#include <stdlib.h>
+#include <private/logd.h>
+
+/*
+ * 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);
+}