Reorganize FORTIFY_SOURCE tests.
Get rid of a lot of the duplication in the various FORTIFY_SOURCE
tests. Instead, we build 4 separate static libraries, with
4 different compile time options, and link them into the final test
binary.
Change-Id: Idb0b7cccc8dd837adb037bf4ddfe8942ae138230
diff --git a/tests/Android.mk b/tests/Android.mk
index d94c77c..b7a6080 100644
--- a/tests/Android.mk
+++ b/tests/Android.mk
@@ -61,8 +61,6 @@
dirent_test.cpp \
eventfd_test.cpp \
fenv_test.cpp \
- fortify1_test.cpp \
- fortify2_test.cpp \
getauxval_test.cpp \
getcwd_test.cpp \
libc_logging_test.cpp \
@@ -88,6 +86,9 @@
test_dynamic_src_files = \
dlfcn_test.cpp \
+test_fortify_static_libraries = \
+ fortify1-tests-gcc fortify2-tests-gcc fortify1-tests-clang fortify2-tests-clang
+
include $(CLEAR_VARS)
LOCAL_MODULE := bionic-unit-tests-unwind-test-impl
LOCAL_CFLAGS += $(test_c_flags) -fexceptions -fnon-call-exceptions
@@ -109,7 +110,7 @@
LOCAL_LDFLAGS += $(test_dynamic_ldflags)
LOCAL_SHARED_LIBRARIES += libdl
LOCAL_SRC_FILES := $(test_src_files) $(test_dynamic_src_files)
-LOCAL_WHOLE_STATIC_LIBRARIES := bionic-unit-tests-clang
+LOCAL_WHOLE_STATIC_LIBRARIES := $(test_fortify_static_libraries)
LOCAL_STATIC_LIBRARIES += bionic-unit-tests-unwind-test-impl
include $(BUILD_NATIVE_TEST)
@@ -122,7 +123,7 @@
LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_SRC_FILES := $(test_src_files)
LOCAL_STATIC_LIBRARIES += libstlport_static libstdc++ libm libc bionic-unit-tests-unwind-test-impl
-LOCAL_WHOLE_STATIC_LIBRARIES := bionic-unit-tests-clang
+LOCAL_WHOLE_STATIC_LIBRARIES := $(test_fortify_static_libraries)
include $(BUILD_NATIVE_TEST)
# -----------------------------------------------------------------------------
@@ -161,25 +162,54 @@
endif
# -----------------------------------------------------------------------------
-# Unit tests which depend on clang as the compiler
+# FORTIFY_SOURCE tests
# -----------------------------------------------------------------------------
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := fortify1_test_clang.cpp fortify2_test_clang.cpp
-LOCAL_MODULE := bionic-unit-tests-clang
-LOCAL_CLANG := true
+
+fortify_c_includes = \
+ bionic \
+ bionic/libstdc++/include \
+ external/stlport/stlport \
+ external/gtest/include
+fortify_test_files = fortify_test.cpp
# -Wno-error=unused-parameter needed as
# external/stlport/stlport/stl/_threads.c (included from
# external/gtest/include/gtest/gtest.h) does not compile cleanly under
# clang. TODO: fix this.
-LOCAL_CFLAGS += $(test_c_flags) -Wno-error=unused-parameter
+fortify_c_flags = $(test_c_flags) -Wno-error=unused-parameter
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify1-tests-gcc
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DTEST_NAME=Fortify1_Gcc
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-LOCAL_C_INCLUDES += bionic \
- bionic/libstdc++/include \
- external/stlport/stlport \
- external/gtest/include
+LOCAL_C_INCLUDES += $(fortify_c_includes)
+include $(BUILD_STATIC_LIBRARY)
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify2-tests-gcc
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DTEST_NAME=Fortify2_Gcc
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_C_INCLUDES += $(fortify_c_includes)
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify1-tests-clang
+LOCAL_CLANG := true
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DTEST_NAME=Fortify1_Clang
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_C_INCLUDES += $(fortify_c_includes)
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := $(fortify_test_files)
+LOCAL_MODULE := fortify2-tests-clang
+LOCAL_CLANG := true
+LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DTEST_NAME=Fortify2_Clang
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
+LOCAL_C_INCLUDES += $(fortify_c_includes)
include $(BUILD_STATIC_LIBRARY)
endif # !BUILD_TINY_ANDROID
diff --git a/tests/fortify1_test.cpp b/tests/fortify1_test.cpp
deleted file mode 100644
index d4e9dd5..0000000
--- a/tests/fortify1_test.cpp
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 1
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-#if __BIONIC__
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-
-// multibyte target where we over fill (should fail)
-TEST(Fortify1_DeathTest, strcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char *orig = strdup("0123456789");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify1_DeathTest, strcpy2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify1_DeathTest, strcpy3_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("1");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify1_DeathTest, strcpy4_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[1];
- char *orig = strdup("12");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-TEST(Fortify1_DeathTest, strlen_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strrchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strlcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "01234567890123");
- size_t n = strlen(bufa);
- ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify1_DeathTest, sprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char source_buf[15];
- memcpy(source_buf, "12345678901234", 15);
- ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, sprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[5];
- ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
-
- va_start(va, fmt);
- result = vsprintf(buf, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify1_DeathTest, vsprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, vsprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
- size_t size = atoi("11");
-
- va_start(va, fmt);
- result = vsnprintf(buf, size, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify1_DeathTest, vsnprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, vsnprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strncat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- size_t n = atoi("10"); // avoid compiler optimizations
- strncpy(buf, "012345678", n);
- ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strncat2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- buf[0] = '\0';
- size_t n = atoi("10"); // avoid compiler optimizations
- ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strcat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char src[11];
- strcpy(src, "0123456789");
- char buf[10];
- buf[0] = '\0';
- ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, memmove_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[20];
- strcpy(buf, "0123456789");
- size_t n = atoi("10");
- ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, memcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[10];
- char bufb[10];
- strcpy(bufa, "012345678");
- size_t n = atoi("11");
- ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, strncpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "01234567890123");
- size_t n = strlen(bufa);
- ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_DeathTest, snprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "0123456789");
- size_t n = strlen(bufa) + 1;
- ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
-
-extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
-extern "C" char* __strcat_chk(char*, const char*, size_t);
-
-TEST(Fortify1, strncat) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('\0', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1, strncat2) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('\0', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1, strncat3) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = '\0';
- char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('0', buf[0]);
- ASSERT_EQ('1', buf[1]);
- ASSERT_EQ('2', buf[2]);
- ASSERT_EQ('3', buf[3]);
- ASSERT_EQ('4', buf[4]);
- ASSERT_EQ('\0', buf[5]);
- ASSERT_EQ('A', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1, strncat4) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[9] = '\0';
- char* res = __strncat_chk(buf, "", 5, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('A', buf[0]);
- ASSERT_EQ('A', buf[1]);
- ASSERT_EQ('A', buf[2]);
- ASSERT_EQ('A', buf[3]);
- ASSERT_EQ('A', buf[4]);
- ASSERT_EQ('A', buf[5]);
- ASSERT_EQ('A', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
-
-TEST(Fortify1, strncat5) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('5', buf[6]);
- ASSERT_EQ('6', buf[7]);
- ASSERT_EQ('7', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
-
-TEST(Fortify1, strncat6) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('5', buf[6]);
- ASSERT_EQ('6', buf[7]);
- ASSERT_EQ('7', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
-
-
-TEST(Fortify1, strcat) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strcat_chk(buf, "01234", sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('\0', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1, strcat2) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strcat_chk(buf, "01234567", sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('5', buf[6]);
- ASSERT_EQ('6', buf[7]);
- ASSERT_EQ('7', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
diff --git a/tests/fortify1_test_clang.cpp b/tests/fortify1_test_clang.cpp
deleted file mode 100644
index 8759c41..0000000
--- a/tests/fortify1_test_clang.cpp
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 1
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-#if __BIONIC__
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-
-// multibyte target where we over fill (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char *orig = strdup("0123456789");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy3_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("1");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify1_Clang_DeathTest, strcpy4_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[1];
- char *orig = strdup("12");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-TEST(Fortify1_Clang_DeathTest, strlen_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strrchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strlcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "01234567890123");
- size_t n = strlen(bufa);
- ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify1_Clang_DeathTest, sprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char source_buf[15];
- memcpy(source_buf, "12345678901234", 15);
- ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, sprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[5];
- ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
-
- va_start(va, fmt);
- result = vsprintf(buf, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify1_Clang_DeathTest, vsprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, vsprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
- size_t size = atoi("11");
-
- va_start(va, fmt);
- result = vsnprintf(buf, size, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify1_Clang_DeathTest, vsnprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, vsnprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strncat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- size_t n = atoi("10"); // avoid compiler optimizations
- strncpy(buf, "012345678", n);
- ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strncat2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- buf[0] = '\0';
- size_t n = atoi("10"); // avoid compiler optimizations
- ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strcat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char src[11];
- strcpy(src, "0123456789");
- char buf[10];
- buf[0] = '\0';
- ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, memmove_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[20];
- strcpy(buf, "0123456789");
- size_t n = atoi("10");
- ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, memcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[10];
- char bufb[10];
- strcpy(bufa, "012345678");
- size_t n = atoi("11");
- ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, strncpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "01234567890123");
- size_t n = strlen(bufa);
- ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify1_Clang_DeathTest, snprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "0123456789");
- size_t n = strlen(bufa) + 1;
- ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
-
-extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
-extern "C" char* __strcat_chk(char*, const char*, size_t);
-
-TEST(Fortify1_Clang, strncat) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('\0', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat2) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('\0', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat3) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = '\0';
- char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('0', buf[0]);
- ASSERT_EQ('1', buf[1]);
- ASSERT_EQ('2', buf[2]);
- ASSERT_EQ('3', buf[3]);
- ASSERT_EQ('4', buf[4]);
- ASSERT_EQ('\0', buf[5]);
- ASSERT_EQ('A', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat4) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[9] = '\0';
- char* res = __strncat_chk(buf, "", 5, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('A', buf[0]);
- ASSERT_EQ('A', buf[1]);
- ASSERT_EQ('A', buf[2]);
- ASSERT_EQ('A', buf[3]);
- ASSERT_EQ('A', buf[4]);
- ASSERT_EQ('A', buf[5]);
- ASSERT_EQ('A', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat5) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('5', buf[6]);
- ASSERT_EQ('6', buf[7]);
- ASSERT_EQ('7', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
-
-TEST(Fortify1_Clang, strncat6) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('5', buf[6]);
- ASSERT_EQ('6', buf[7]);
- ASSERT_EQ('7', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
-
-
-TEST(Fortify1_Clang, strcat) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strcat_chk(buf, "01234", sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('\0', buf[6]);
- ASSERT_EQ('A', buf[7]);
- ASSERT_EQ('A', buf[8]);
- ASSERT_EQ('A', buf[9]);
-}
-
-TEST(Fortify1_Clang, strcat2) {
- char buf[10];
- memset(buf, 'A', sizeof(buf));
- buf[0] = 'a';
- buf[1] = '\0';
- char* res = __strcat_chk(buf, "01234567", sizeof(buf));
- ASSERT_EQ(buf, res);
- ASSERT_EQ('a', buf[0]);
- ASSERT_EQ('0', buf[1]);
- ASSERT_EQ('1', buf[2]);
- ASSERT_EQ('2', buf[3]);
- ASSERT_EQ('3', buf[4]);
- ASSERT_EQ('4', buf[5]);
- ASSERT_EQ('5', buf[6]);
- ASSERT_EQ('6', buf[7]);
- ASSERT_EQ('7', buf[8]);
- ASSERT_EQ('\0', buf[9]);
-}
-
-__BIONIC_FORTIFY_INLINE
-size_t test_fortify_inline(char* buf) {
- return __bos(buf);
-}
-
-TEST(Fortify1_Clang, fortify_inline) {
- char buf[1024];
- // no-op. Prints nothing. Needed to prevent the compiler
- // from optimizing out buf.
- buf[0] = '\0';
- printf("%s", buf);
- ASSERT_EQ(sizeof(buf), test_fortify_inline(buf));
-}
diff --git a/tests/fortify2_test.cpp b/tests/fortify2_test.cpp
deleted file mode 100644
index 1fa34ca..0000000
--- a/tests/fortify2_test.cpp
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 2
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-struct foo {
- char empty[0];
- char one[1];
- char a[10];
- char b[10];
-};
-
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-TEST(Fortify2_DeathTest, strncpy_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- int copy_amt = atoi("11");
- ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt),
- testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, sprintf_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- char source_buf[15];
- memcpy(source_buf, "12345678901234", 15);
- ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
- testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, sprintf2_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- ASSERT_EXIT(sprintf(myfoo.a, "0123456789"),
- testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper2(const char *fmt, ...) {
- foo myfoo;
- va_list va;
- int result;
-
- va_start(va, fmt);
- result = vsprintf(myfoo.a, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify2_DeathTest, vsprintf_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsprintf2_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper2(const char *fmt, ...) {
- foo myfoo;
- va_list va;
- int result;
- size_t size = atoi("11");
-
- va_start(va, fmt);
- result = vsnprintf(myfoo.a, size, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify2_DeathTest, vsnprintf_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsnprintf2_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-#if __BIONIC__
-// zero sized target with "\0" source (should fail)
-TEST(Fortify2_DeathTest, strcpy_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- char* src = strdup("");
- ASSERT_EXIT(strcpy(myfoo.empty, src),
- testing::KilledBySignal(SIGABRT), "");
- free(src);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy2_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- char* src = strdup("1");
- ASSERT_EXIT(strcpy(myfoo.empty, src),
- testing::KilledBySignal(SIGABRT), "");
- free(src);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy3_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- char* src = strdup("12");
- ASSERT_EXIT(strcpy(myfoo.one, src),
- testing::KilledBySignal(SIGABRT), "");
- free(src);
-}
-
-TEST(Fortify2_DeathTest, strchr_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
- myfoo.b[0] = '\0';
- ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
- testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strrchr_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- memcpy(myfoo.a, "0123456789", 10);
- memcpy(myfoo.b, "01234", 6);
- ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
- testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strlcpy_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- strcpy(myfoo.a, "01");
- size_t n = strlen(myfoo.a);
- ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
- testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify2_DeathTest, strncat_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- size_t n = atoi("10"); // avoid compiler optimizations
- strncpy(myfoo.a, "012345678", n);
- ASSERT_EXIT(strncat(myfoo.a, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat2_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- myfoo.a[0] = '\0';
- size_t n = atoi("10"); // avoid compiler optimizations
- ASSERT_EXIT(strncat(myfoo.a, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat3_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
- myfoo.b[0] = '\0';
- size_t n = atoi("10"); // avoid compiler optimizations
- ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strcat_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char src[11];
- strcpy(src, "0123456789");
- foo myfoo;
- myfoo.a[0] = '\0';
- ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strcat2_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
- myfoo.b[0] = '\0';
- ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, snprintf_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- strcpy(myfoo.a, "012345678");
- size_t n = strlen(myfoo.a) + 2;
- ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
-}
-
-/***********************************************************/
-/* TESTS BELOW HERE DUPLICATE TESTS FROM fortify1_test.cpp */
-/***********************************************************/
-
-#if __BIONIC__
-// multibyte target where we over fill (should fail)
-TEST(Fortify2_DeathTest, strcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char *orig = strdup("0123456789");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify2_DeathTest, strcpy2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy3_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("1");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify2_DeathTest, strcpy4_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[1];
- char *orig = strdup("12");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-TEST(Fortify2_DeathTest, strlen_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strrchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strlcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "01234567890123");
- size_t n = strlen(bufa);
- ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-#endif
-
-TEST(Fortify2_DeathTest, sprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char source_buf[15];
- memcpy(source_buf, "12345678901234", 15);
- ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, sprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[5];
- ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
-
- va_start(va, fmt);
- result = vsprintf(buf, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify2_DeathTest, vsprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
- size_t size = atoi("11");
-
- va_start(va, fmt);
- result = vsnprintf(buf, size, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify2_DeathTest, vsnprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, vsnprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- size_t n = atoi("10"); // avoid compiler optimizations
- strncpy(buf, "012345678", n);
- ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncat2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- buf[0] = '\0';
- size_t n = atoi("10"); // avoid compiler optimizations
- ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strcat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char src[11];
- strcpy(src, "0123456789");
- char buf[10];
- buf[0] = '\0';
- ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, memmove_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[20];
- strcpy(buf, "0123456789");
- size_t n = atoi("10");
- ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, memcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[10];
- char bufb[10];
- strcpy(bufa, "012345678");
- size_t n = atoi("11");
- ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, strncpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "01234567890123");
- size_t n = strlen(bufa);
- ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_DeathTest, snprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "0123456789");
- size_t n = strlen(bufa) + 1;
- ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
diff --git a/tests/fortify2_test_clang.cpp b/tests/fortify2_test_clang.cpp
deleted file mode 100644
index 83f57e8..0000000
--- a/tests/fortify2_test_clang.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#undef _FORTIFY_SOURCE
-#define _FORTIFY_SOURCE 2
-
-#include <gtest/gtest.h>
-#include <string.h>
-#include <stdarg.h>
-
-struct foo {
- char empty[0];
- char one[1];
- char a[10];
- char b[10];
-};
-
-// We have to say "DeathTest" here so gtest knows to run this test (which exits)
-// in its own process.
-TEST(Fortify2_Clang_DeathTest, strncat3_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
- myfoo.b[0] = '\0';
- size_t n = atoi("10"); // avoid compiler optimizations
- ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strcat2_fortified2) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- foo myfoo;
- memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
- myfoo.b[0] = '\0';
- ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
-}
-
-/*****************************************************************/
-/* TESTS BELOW HERE DUPLICATE TESTS FROM fortify1_test_clang.cpp */
-/*****************************************************************/
-
-#if __BIONIC__
-// multibyte target where we over fill (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char *orig = strdup("0123456789");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with "\0" source (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// zero sized target with longer source (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy3_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[0];
- char *orig = strdup("1");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-// one byte target with longer source (should fail)
-TEST(Fortify2_Clang_DeathTest, strcpy4_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[1];
- char *orig = strdup("12");
- ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
- free(orig);
-}
-
-TEST(Fortify2_Clang_DeathTest, strlen_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strrchr_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- memcpy(buf, "0123456789", sizeof(buf));
- ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
-}
-#endif
-
-TEST(Fortify2_Clang_DeathTest, sprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- char source_buf[15];
- memcpy(source_buf, "12345678901234", 15);
- ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, sprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[5];
- ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
-
- va_start(va, fmt);
- result = vsprintf(buf, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify2_Clang_DeathTest, vsprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, vsprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-static int vsnprintf_helper(const char *fmt, ...) {
- char buf[10];
- va_list va;
- int result;
- size_t size = atoi("11");
-
- va_start(va, fmt);
- result = vsnprintf(buf, size, fmt, va); // should crash here
- va_end(va);
- return result;
-}
-
-TEST(Fortify2_Clang_DeathTest, vsnprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, vsnprintf2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strncat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- size_t n = atoi("10"); // avoid compiler optimizations
- strncpy(buf, "012345678", n);
- ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strncat2_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[10];
- buf[0] = '\0';
- size_t n = atoi("10"); // avoid compiler optimizations
- ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strcat_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char src[11];
- strcpy(src, "0123456789");
- char buf[10];
- buf[0] = '\0';
- ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, memmove_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char buf[20];
- strcpy(buf, "0123456789");
- size_t n = atoi("10");
- ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, memcpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[10];
- char bufb[10];
- strcpy(bufa, "012345678");
- size_t n = atoi("11");
- ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, strncpy_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "01234567890123");
- size_t n = strlen(bufa);
- ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
-}
-
-TEST(Fortify2_Clang_DeathTest, snprintf_fortified) {
- ::testing::FLAGS_gtest_death_test_style = "threadsafe";
- char bufa[15];
- char bufb[10];
- strcpy(bufa, "0123456789");
- size_t n = strlen(bufa) + 1;
- ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
-}
-
-__BIONIC_FORTIFY_INLINE
-size_t test_fortify2_inline(char* buf) {
- return __bos(buf);
-}
-
-TEST(Fortify2_Clang, fortify_inline) {
- char buf[1024];
- // no-op. Prints nothing. Needed to prevent the compiler
- // from optimizing out buf.
- buf[0] = '\0';
- printf("%s", buf);
- ASSERT_EQ(sizeof(buf), test_fortify2_inline(buf));
-}
diff --git a/tests/fortify_test.cpp b/tests/fortify_test.cpp
new file mode 100644
index 0000000..68b5517
--- /dev/null
+++ b/tests/fortify_test.cpp
@@ -0,0 +1,611 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+#include <string.h>
+#include <stdarg.h>
+
+// We have to say "DeathTest" here so gtest knows to run this test (which exits)
+// in its own process. Unfortunately, the C preprocessor doesn't give us an
+// easy way to concatenate strings, so we need to use the complicated method
+// below. *sigh*
+#define DEATHTEST_PASTER(name) name##_DeathTest
+#define DEATHTEST_EVALUATOR(name) DEATHTEST_PASTER(name)
+#define DEATHTEST DEATHTEST_EVALUATOR(TEST_NAME)
+
+#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 2
+struct foo {
+ char empty[0];
+ char one[1];
+ char a[10];
+ char b[10];
+};
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strncpy_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ int copy_amt = atoi("11");
+ ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt),
+ testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, sprintf_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ char source_buf[15];
+ memcpy(source_buf, "12345678901234", 15);
+ ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
+ testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, sprintf2_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ ASSERT_EXIT(sprintf(myfoo.a, "0123456789"),
+ testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// These tests are disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+static int vsprintf_helper2(const char *fmt, ...) {
+ foo myfoo;
+ va_list va;
+ int result;
+
+ va_start(va, fmt);
+ result = vsprintf(myfoo.a, fmt, va); // should crash here
+ va_end(va);
+ return result;
+}
+
+TEST(DEATHTEST, vsprintf_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsprintf2_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// These tests are disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+static int vsnprintf_helper2(const char *fmt, ...) {
+ foo myfoo;
+ va_list va;
+ int result;
+ size_t size = atoi("11");
+
+ va_start(va, fmt);
+ result = vsnprintf(myfoo.a, size, fmt, va); // should crash here
+ va_end(va);
+ return result;
+}
+
+TEST(DEATHTEST, vsnprintf_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsnprintf2_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#if __BIONIC__
+
+#ifndef __clang__
+// zero sized target with "\0" source (should fail)
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcpy_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ char* src = strdup("");
+ ASSERT_EXIT(strcpy(myfoo.empty, src),
+ testing::KilledBySignal(SIGABRT), "");
+ free(src);
+}
+#endif
+
+#ifndef __clang__
+// zero sized target with longer source (should fail)
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcpy2_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ char* src = strdup("1");
+ ASSERT_EXIT(strcpy(myfoo.empty, src),
+ testing::KilledBySignal(SIGABRT), "");
+ free(src);
+}
+#endif
+
+#ifndef __clang__
+// one byte target with longer source (should fail)
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcpy3_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ char* src = strdup("12");
+ ASSERT_EXIT(strcpy(myfoo.one, src),
+ testing::KilledBySignal(SIGABRT), "");
+ free(src);
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strchr_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
+ myfoo.b[0] = '\0';
+ ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
+ testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strrchr_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ memcpy(myfoo.a, "0123456789", 10);
+ memcpy(myfoo.b, "01234", 6);
+ ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
+ testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strlcpy_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ strcpy(myfoo.a, "01");
+ size_t n = strlen(myfoo.a);
+ ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
+ testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#endif /* __BIONIC__ */
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strncat_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ size_t n = atoi("10"); // avoid compiler optimizations
+ strncpy(myfoo.a, "012345678", n);
+ ASSERT_EXIT(strncat(myfoo.a, "9", n), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strncat2_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ myfoo.a[0] = '\0';
+ size_t n = atoi("10"); // avoid compiler optimizations
+ ASSERT_EXIT(strncat(myfoo.a, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+TEST(DEATHTEST, strncat3_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
+ myfoo.b[0] = '\0';
+ size_t n = atoi("10"); // avoid compiler optimizations
+ ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+#ifndef __clang__
+// This test is disabled in clang because clang doesn't properly detect
+// this buffer overflow. TODO: Fix clang.
+TEST(DEATHTEST, strcat_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char src[11];
+ strcpy(src, "0123456789");
+ foo myfoo;
+ myfoo.a[0] = '\0';
+ ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), "");
+}
+#endif
+
+TEST(DEATHTEST, strcat2_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string
+ myfoo.b[0] = '\0';
+ ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, snprintf_fortified2) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ foo myfoo;
+ strcpy(myfoo.a, "012345678");
+ size_t n = strlen(myfoo.a) + 2;
+ ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
+}
+
+#endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */
+
+#if __BIONIC__
+// multibyte target where we over fill (should fail)
+TEST(DEATHTEST, strcpy_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[10];
+ char *orig = strdup("0123456789");
+ ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+ free(orig);
+}
+
+// zero sized target with "\0" source (should fail)
+TEST(DEATHTEST, strcpy2_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[0];
+ char *orig = strdup("");
+ ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+ free(orig);
+}
+
+// zero sized target with longer source (should fail)
+TEST(DEATHTEST, strcpy3_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[0];
+ char *orig = strdup("1");
+ ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+ free(orig);
+}
+
+// one byte target with longer source (should fail)
+TEST(DEATHTEST, strcpy4_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[1];
+ char *orig = strdup("12");
+ ASSERT_EXIT(strcpy(buf, orig), testing::KilledBySignal(SIGABRT), "");
+ free(orig);
+}
+
+TEST(DEATHTEST, strlen_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[10];
+ memcpy(buf, "0123456789", sizeof(buf));
+ ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strchr_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[10];
+ memcpy(buf, "0123456789", sizeof(buf));
+ ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strrchr_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[10];
+ memcpy(buf, "0123456789", sizeof(buf));
+ ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strlcpy_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char bufa[15];
+ char bufb[10];
+ strcpy(bufa, "01234567890123");
+ size_t n = strlen(bufa);
+ ASSERT_EXIT(strlcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+#endif
+
+TEST(DEATHTEST, sprintf_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[10];
+ char source_buf[15];
+ memcpy(source_buf, "12345678901234", 15);
+ ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, sprintf2_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[5];
+ ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
+}
+
+static int vsprintf_helper(const char *fmt, ...) {
+ char buf[10];
+ va_list va;
+ int result;
+
+ va_start(va, fmt);
+ result = vsprintf(buf, fmt, va); // should crash here
+ va_end(va);
+ return result;
+}
+
+TEST(DEATHTEST, vsprintf_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsprintf2_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+static int vsnprintf_helper(const char *fmt, ...) {
+ char buf[10];
+ va_list va;
+ int result;
+ size_t size = atoi("11");
+
+ va_start(va, fmt);
+ result = vsnprintf(buf, size, fmt, va); // should crash here
+ va_end(va);
+ return result;
+}
+
+TEST(DEATHTEST, vsnprintf_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, vsnprintf2_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strncat_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[10];
+ size_t n = atoi("10"); // avoid compiler optimizations
+ strncpy(buf, "012345678", n);
+ ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strncat2_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[10];
+ buf[0] = '\0';
+ size_t n = atoi("10"); // avoid compiler optimizations
+ ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strcat_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char src[11];
+ strcpy(src, "0123456789");
+ char buf[10];
+ buf[0] = '\0';
+ ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, memmove_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char buf[20];
+ strcpy(buf, "0123456789");
+ size_t n = atoi("10");
+ ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, memcpy_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char bufa[10];
+ char bufb[10];
+ strcpy(bufa, "012345678");
+ size_t n = atoi("11");
+ ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, strncpy_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char bufa[15];
+ char bufb[10];
+ strcpy(bufa, "01234567890123");
+ size_t n = strlen(bufa);
+ ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), "");
+}
+
+TEST(DEATHTEST, snprintf_fortified) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ char bufa[15];
+ char bufb[10];
+ strcpy(bufa, "0123456789");
+ size_t n = strlen(bufa) + 1;
+ ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), "");
+}
+
+extern "C" char* __strncat_chk(char*, const char*, size_t, size_t);
+extern "C" char* __strcat_chk(char*, const char*, size_t);
+
+TEST(TEST_NAME, strncat) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[0] = 'a';
+ buf[1] = '\0';
+ char* res = __strncat_chk(buf, "01234", sizeof(buf) - strlen(buf) - 1, sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('a', buf[0]);
+ ASSERT_EQ('0', buf[1]);
+ ASSERT_EQ('1', buf[2]);
+ ASSERT_EQ('2', buf[3]);
+ ASSERT_EQ('3', buf[4]);
+ ASSERT_EQ('4', buf[5]);
+ ASSERT_EQ('\0', buf[6]);
+ ASSERT_EQ('A', buf[7]);
+ ASSERT_EQ('A', buf[8]);
+ ASSERT_EQ('A', buf[9]);
+}
+
+TEST(TEST_NAME, strncat2) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[0] = 'a';
+ buf[1] = '\0';
+ char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('a', buf[0]);
+ ASSERT_EQ('0', buf[1]);
+ ASSERT_EQ('1', buf[2]);
+ ASSERT_EQ('2', buf[3]);
+ ASSERT_EQ('3', buf[4]);
+ ASSERT_EQ('4', buf[5]);
+ ASSERT_EQ('\0', buf[6]);
+ ASSERT_EQ('A', buf[7]);
+ ASSERT_EQ('A', buf[8]);
+ ASSERT_EQ('A', buf[9]);
+}
+
+TEST(TEST_NAME, strncat3) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[0] = '\0';
+ char* res = __strncat_chk(buf, "0123456789", 5, sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('0', buf[0]);
+ ASSERT_EQ('1', buf[1]);
+ ASSERT_EQ('2', buf[2]);
+ ASSERT_EQ('3', buf[3]);
+ ASSERT_EQ('4', buf[4]);
+ ASSERT_EQ('\0', buf[5]);
+ ASSERT_EQ('A', buf[6]);
+ ASSERT_EQ('A', buf[7]);
+ ASSERT_EQ('A', buf[8]);
+ ASSERT_EQ('A', buf[9]);
+}
+
+TEST(TEST_NAME, strncat4) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[9] = '\0';
+ char* res = __strncat_chk(buf, "", 5, sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('A', buf[0]);
+ ASSERT_EQ('A', buf[1]);
+ ASSERT_EQ('A', buf[2]);
+ ASSERT_EQ('A', buf[3]);
+ ASSERT_EQ('A', buf[4]);
+ ASSERT_EQ('A', buf[5]);
+ ASSERT_EQ('A', buf[6]);
+ ASSERT_EQ('A', buf[7]);
+ ASSERT_EQ('A', buf[8]);
+ ASSERT_EQ('\0', buf[9]);
+}
+
+TEST(TEST_NAME, strncat5) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[0] = 'a';
+ buf[1] = '\0';
+ char* res = __strncat_chk(buf, "01234567", 8, sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('a', buf[0]);
+ ASSERT_EQ('0', buf[1]);
+ ASSERT_EQ('1', buf[2]);
+ ASSERT_EQ('2', buf[3]);
+ ASSERT_EQ('3', buf[4]);
+ ASSERT_EQ('4', buf[5]);
+ ASSERT_EQ('5', buf[6]);
+ ASSERT_EQ('6', buf[7]);
+ ASSERT_EQ('7', buf[8]);
+ ASSERT_EQ('\0', buf[9]);
+}
+
+TEST(TEST_NAME, strncat6) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[0] = 'a';
+ buf[1] = '\0';
+ char* res = __strncat_chk(buf, "01234567", 9, sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('a', buf[0]);
+ ASSERT_EQ('0', buf[1]);
+ ASSERT_EQ('1', buf[2]);
+ ASSERT_EQ('2', buf[3]);
+ ASSERT_EQ('3', buf[4]);
+ ASSERT_EQ('4', buf[5]);
+ ASSERT_EQ('5', buf[6]);
+ ASSERT_EQ('6', buf[7]);
+ ASSERT_EQ('7', buf[8]);
+ ASSERT_EQ('\0', buf[9]);
+}
+
+
+TEST(TEST_NAME, strcat) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[0] = 'a';
+ buf[1] = '\0';
+ char* res = __strcat_chk(buf, "01234", sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('a', buf[0]);
+ ASSERT_EQ('0', buf[1]);
+ ASSERT_EQ('1', buf[2]);
+ ASSERT_EQ('2', buf[3]);
+ ASSERT_EQ('3', buf[4]);
+ ASSERT_EQ('4', buf[5]);
+ ASSERT_EQ('\0', buf[6]);
+ ASSERT_EQ('A', buf[7]);
+ ASSERT_EQ('A', buf[8]);
+ ASSERT_EQ('A', buf[9]);
+}
+
+TEST(TEST_NAME, strcat2) {
+ char buf[10];
+ memset(buf, 'A', sizeof(buf));
+ buf[0] = 'a';
+ buf[1] = '\0';
+ char* res = __strcat_chk(buf, "01234567", sizeof(buf));
+ ASSERT_EQ(buf, res);
+ ASSERT_EQ('a', buf[0]);
+ ASSERT_EQ('0', buf[1]);
+ ASSERT_EQ('1', buf[2]);
+ ASSERT_EQ('2', buf[3]);
+ ASSERT_EQ('3', buf[4]);
+ ASSERT_EQ('4', buf[5]);
+ ASSERT_EQ('5', buf[6]);
+ ASSERT_EQ('6', buf[7]);
+ ASSERT_EQ('7', buf[8]);
+ ASSERT_EQ('\0', buf[9]);
+}