From: Nick Kralevich Date: Fri, 28 Jun 2013 17:34:09 +0000 (-0700) Subject: Reorganize FORTIFY_SOURCE tests. X-Git-Tag: android-x86-4.4-r1~19^2~52^2^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=5bcf39842e8c4b02ae557a2765a84e724f762469;p=android-x86%2Fbionic.git 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 d94c77cdf..b7a608097 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -61,8 +61,6 @@ test_src_files = \ 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_ldflags = -Wl,--export-dynamic -Wl,-u,DlSymTestFunction 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_CFLAGS += $(test_c_flags) 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_CFLAGS += $(test_c_flags) 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 @@ include $(BUILD_HOST_NATIVE_TEST) 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 += $(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 += 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-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 d4e9dd51d..000000000 --- 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 -#include -#include - -#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 8759c4173..000000000 --- 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 -#include -#include - -#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_clang.cpp b/tests/fortify2_test_clang.cpp deleted file mode 100644 index 83f57e8f4..000000000 --- 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 -#include -#include - -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/fortify2_test.cpp b/tests/fortify_test.cpp similarity index 57% rename from tests/fortify2_test.cpp rename to tests/fortify_test.cpp index 1fa34cae8..68b5517d6 100644 --- a/tests/fortify2_test.cpp +++ b/tests/fortify_test.cpp @@ -14,13 +14,19 @@ * limitations under the License. */ -#undef _FORTIFY_SOURCE -#define _FORTIFY_SOURCE 2 - #include #include #include +// 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]; @@ -28,17 +34,22 @@ struct foo { 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) { +#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 -TEST(Fortify2_DeathTest, sprintf_fortified2) { +#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]; @@ -46,14 +57,22 @@ TEST(Fortify2_DeathTest, sprintf_fortified2) { ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf), testing::KilledBySignal(SIGABRT), ""); } +#endif -TEST(Fortify2_DeathTest, sprintf2_fortified2) { +#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; @@ -65,16 +84,20 @@ static int vsprintf_helper2(const char *fmt, ...) { return result; } -TEST(Fortify2_DeathTest, vsprintf_fortified2) { +TEST(DEATHTEST, vsprintf_fortified2) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, vsprintf2_fortified2) { +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; @@ -87,19 +110,24 @@ static int vsnprintf_helper2(const char *fmt, ...) { return result; } -TEST(Fortify2_DeathTest, vsnprintf_fortified2) { +TEST(DEATHTEST, vsnprintf_fortified2) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, vsnprintf2_fortified2) { +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) -TEST(Fortify2_DeathTest, strcpy_fortified2) { +// 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(""); @@ -107,9 +135,13 @@ TEST(Fortify2_DeathTest, strcpy_fortified2) { testing::KilledBySignal(SIGABRT), ""); free(src); } +#endif +#ifndef __clang__ // zero sized target with longer source (should fail) -TEST(Fortify2_DeathTest, strcpy2_fortified2) { +// 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"); @@ -117,9 +149,13 @@ TEST(Fortify2_DeathTest, strcpy2_fortified2) { testing::KilledBySignal(SIGABRT), ""); free(src); } +#endif +#ifndef __clang__ // one byte target with longer source (should fail) -TEST(Fortify2_DeathTest, strcpy3_fortified2) { +// 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"); @@ -127,8 +163,12 @@ TEST(Fortify2_DeathTest, strcpy3_fortified2) { testing::KilledBySignal(SIGABRT), ""); free(src); } +#endif -TEST(Fortify2_DeathTest, strchr_fortified2) { +#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)); @@ -136,8 +176,12 @@ TEST(Fortify2_DeathTest, strchr_fortified2) { ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')), testing::KilledBySignal(SIGABRT), ""); } +#endif -TEST(Fortify2_DeathTest, strrchr_fortified2) { +#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); @@ -145,8 +189,12 @@ TEST(Fortify2_DeathTest, strrchr_fortified2) { ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')), testing::KilledBySignal(SIGABRT), ""); } +#endif -TEST(Fortify2_DeathTest, strlcpy_fortified2) { +#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"); @@ -154,26 +202,35 @@ TEST(Fortify2_DeathTest, strlcpy_fortified2) { ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n), testing::KilledBySignal(SIGABRT), ""); } - #endif -TEST(Fortify2_DeathTest, strncat_fortified2) { +#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 -TEST(Fortify2_DeathTest, strncat2_fortified2) { +#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(Fortify2_DeathTest, strncat3_fortified2) { +TEST(DEATHTEST, strncat3_fortified2) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; foo myfoo; memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string @@ -182,7 +239,10 @@ TEST(Fortify2_DeathTest, strncat3_fortified2) { ASSERT_EXIT(strncat(myfoo.b, myfoo.a, n), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, strcat_fortified2) { +#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"); @@ -190,8 +250,9 @@ TEST(Fortify2_DeathTest, strcat_fortified2) { myfoo.a[0] = '\0'; ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), ""); } +#endif -TEST(Fortify2_DeathTest, strcat2_fortified2) { +TEST(DEATHTEST, strcat2_fortified2) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; foo myfoo; memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string @@ -199,7 +260,7 @@ TEST(Fortify2_DeathTest, strcat2_fortified2) { ASSERT_EXIT(strcat(myfoo.b, myfoo.a), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, snprintf_fortified2) { +TEST(DEATHTEST, snprintf_fortified2) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; foo myfoo; strcpy(myfoo.a, "012345678"); @@ -207,13 +268,11 @@ TEST(Fortify2_DeathTest, snprintf_fortified2) { ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), ""); } -/***********************************************************/ -/* TESTS BELOW HERE DUPLICATE TESTS FROM fortify1_test.cpp */ -/***********************************************************/ +#endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */ #if __BIONIC__ // multibyte target where we over fill (should fail) -TEST(Fortify2_DeathTest, strcpy_fortified) { +TEST(DEATHTEST, strcpy_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[10]; char *orig = strdup("0123456789"); @@ -222,7 +281,7 @@ TEST(Fortify2_DeathTest, strcpy_fortified) { } // zero sized target with "\0" source (should fail) -TEST(Fortify2_DeathTest, strcpy2_fortified) { +TEST(DEATHTEST, strcpy2_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[0]; char *orig = strdup(""); @@ -231,7 +290,7 @@ TEST(Fortify2_DeathTest, strcpy2_fortified) { } // zero sized target with longer source (should fail) -TEST(Fortify2_DeathTest, strcpy3_fortified) { +TEST(DEATHTEST, strcpy3_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[0]; char *orig = strdup("1"); @@ -240,7 +299,7 @@ TEST(Fortify2_DeathTest, strcpy3_fortified) { } // one byte target with longer source (should fail) -TEST(Fortify2_DeathTest, strcpy4_fortified) { +TEST(DEATHTEST, strcpy4_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[1]; char *orig = strdup("12"); @@ -248,28 +307,28 @@ TEST(Fortify2_DeathTest, strcpy4_fortified) { free(orig); } -TEST(Fortify2_DeathTest, strlen_fortified) { +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(Fortify2_DeathTest, strchr_fortified) { +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(Fortify2_DeathTest, strrchr_fortified) { +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(Fortify2_DeathTest, strlcpy_fortified) { +TEST(DEATHTEST, strlcpy_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char bufa[15]; char bufb[10]; @@ -280,7 +339,7 @@ TEST(Fortify2_DeathTest, strlcpy_fortified) { #endif -TEST(Fortify2_DeathTest, sprintf_fortified) { +TEST(DEATHTEST, sprintf_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[10]; char source_buf[15]; @@ -288,7 +347,7 @@ TEST(Fortify2_DeathTest, sprintf_fortified) { ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, sprintf2_fortified) { +TEST(DEATHTEST, sprintf2_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[5]; ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), ""); @@ -305,12 +364,12 @@ static int vsprintf_helper(const char *fmt, ...) { return result; } -TEST(Fortify2_DeathTest, vsprintf_fortified) { +TEST(DEATHTEST, vsprintf_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, vsprintf2_fortified) { +TEST(DEATHTEST, vsprintf2_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), ""); } @@ -327,17 +386,17 @@ static int vsnprintf_helper(const char *fmt, ...) { return result; } -TEST(Fortify2_DeathTest, vsnprintf_fortified) { +TEST(DEATHTEST, vsnprintf_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, vsnprintf2_fortified) { +TEST(DEATHTEST, vsnprintf2_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, strncat_fortified) { +TEST(DEATHTEST, strncat_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[10]; size_t n = atoi("10"); // avoid compiler optimizations @@ -345,7 +404,7 @@ TEST(Fortify2_DeathTest, strncat_fortified) { ASSERT_EXIT(strncat(buf, "9", n), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, strncat2_fortified) { +TEST(DEATHTEST, strncat2_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[10]; buf[0] = '\0'; @@ -353,7 +412,7 @@ TEST(Fortify2_DeathTest, strncat2_fortified) { ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, strcat_fortified) { +TEST(DEATHTEST, strcat_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char src[11]; strcpy(src, "0123456789"); @@ -362,7 +421,7 @@ TEST(Fortify2_DeathTest, strcat_fortified) { ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, memmove_fortified) { +TEST(DEATHTEST, memmove_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char buf[20]; strcpy(buf, "0123456789"); @@ -370,7 +429,7 @@ TEST(Fortify2_DeathTest, memmove_fortified) { ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, memcpy_fortified) { +TEST(DEATHTEST, memcpy_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char bufa[10]; char bufb[10]; @@ -379,7 +438,7 @@ TEST(Fortify2_DeathTest, memcpy_fortified) { ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, strncpy_fortified) { +TEST(DEATHTEST, strncpy_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char bufa[15]; char bufb[10]; @@ -388,7 +447,7 @@ TEST(Fortify2_DeathTest, strncpy_fortified) { ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), ""); } -TEST(Fortify2_DeathTest, snprintf_fortified) { +TEST(DEATHTEST, snprintf_fortified) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char bufa[15]; char bufb[10]; @@ -396,3 +455,157 @@ TEST(Fortify2_DeathTest, snprintf_fortified) { 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]); +}