am 394df35e: Merge "Reorganize FORTIFY_SOURCE tests."

* commit '394df35e641816a3b9f0e065840b673dec9c73e5':
  Reorganize FORTIFY_SOURCE tests.
This commit is contained in:
Nick Kralevich 2013-06-28 13:11:14 -07:00 committed by Android Git Automerger
commit 2018cfa85d
5 changed files with 306 additions and 1049 deletions

View File

@ -61,8 +61,6 @@ test_src_files = \
dirent_test.cpp \ dirent_test.cpp \
eventfd_test.cpp \ eventfd_test.cpp \
fenv_test.cpp \ fenv_test.cpp \
fortify1_test.cpp \
fortify2_test.cpp \
getauxval_test.cpp \ getauxval_test.cpp \
getcwd_test.cpp \ getcwd_test.cpp \
libc_logging_test.cpp \ libc_logging_test.cpp \
@ -88,6 +86,9 @@ test_dynamic_ldflags = -Wl,--export-dynamic -Wl,-u,DlSymTestFunction
test_dynamic_src_files = \ test_dynamic_src_files = \
dlfcn_test.cpp \ dlfcn_test.cpp \
test_fortify_static_libraries = \
fortify1-tests-gcc fortify2-tests-gcc fortify1-tests-clang fortify2-tests-clang
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := bionic-unit-tests-unwind-test-impl LOCAL_MODULE := bionic-unit-tests-unwind-test-impl
LOCAL_CFLAGS += $(test_c_flags) -fexceptions -fnon-call-exceptions LOCAL_CFLAGS += $(test_c_flags) -fexceptions -fnon-call-exceptions
@ -109,7 +110,7 @@ LOCAL_CFLAGS += $(test_c_flags)
LOCAL_LDFLAGS += $(test_dynamic_ldflags) LOCAL_LDFLAGS += $(test_dynamic_ldflags)
LOCAL_SHARED_LIBRARIES += libdl LOCAL_SHARED_LIBRARIES += libdl
LOCAL_SRC_FILES := $(test_src_files) $(test_dynamic_src_files) 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 LOCAL_STATIC_LIBRARIES += bionic-unit-tests-unwind-test-impl
include $(BUILD_NATIVE_TEST) include $(BUILD_NATIVE_TEST)
@ -122,7 +123,7 @@ LOCAL_CFLAGS += $(test_c_flags)
LOCAL_FORCE_STATIC_EXECUTABLE := true LOCAL_FORCE_STATIC_EXECUTABLE := true
LOCAL_SRC_FILES := $(test_src_files) LOCAL_SRC_FILES := $(test_src_files)
LOCAL_STATIC_LIBRARIES += libstlport_static libstdc++ libm libc bionic-unit-tests-unwind-test-impl 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) include $(BUILD_NATIVE_TEST)
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
@ -161,25 +162,54 @@ include $(BUILD_HOST_NATIVE_TEST)
endif 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 fortify_c_includes = \
LOCAL_MODULE := bionic-unit-tests-clang bionic \
LOCAL_CLANG := true bionic/libstdc++/include \
external/stlport/stlport \
external/gtest/include
fortify_test_files = fortify_test.cpp
# -Wno-error=unused-parameter needed as # -Wno-error=unused-parameter needed as
# external/stlport/stlport/stl/_threads.c (included from # external/stlport/stlport/stl/_threads.c (included from
# external/gtest/include/gtest/gtest.h) does not compile cleanly under # external/gtest/include/gtest/gtest.h) does not compile cleanly under
# clang. TODO: fix this. # 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_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
LOCAL_C_INCLUDES += bionic \ LOCAL_C_INCLUDES += $(fortify_c_includes)
bionic/libstdc++/include \ include $(BUILD_STATIC_LIBRARY)
external/stlport/stlport \
external/gtest/include
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) include $(BUILD_STATIC_LIBRARY)
endif # !BUILD_TINY_ANDROID endif # !BUILD_TINY_ANDROID

View File

@ -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]);
}

View File

@ -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));
}

View File

@ -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));
}

View File

@ -14,13 +14,19 @@
* limitations under the License. * limitations under the License.
*/ */
#undef _FORTIFY_SOURCE
#define _FORTIFY_SOURCE 2
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <string.h> #include <string.h>
#include <stdarg.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 { struct foo {
char empty[0]; char empty[0];
char one[1]; char one[1];
@ -28,17 +34,22 @@ struct foo {
char b[10]; char b[10];
}; };
// We have to say "DeathTest" here so gtest knows to run this test (which exits) #ifndef __clang__
// in its own process. // This test is disabled in clang because clang doesn't properly detect
TEST(Fortify2_DeathTest, strncpy_fortified2) { // this buffer overflow. TODO: Fix clang.
TEST(DEATHTEST, strncpy_fortified2) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
int copy_amt = atoi("11"); int copy_amt = atoi("11");
ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt), ASSERT_EXIT(strncpy(myfoo.a, "01234567890", copy_amt),
testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
char source_buf[15]; char source_buf[15];
@ -46,14 +57,22 @@ TEST(Fortify2_DeathTest, sprintf_fortified2) {
ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf), ASSERT_EXIT(sprintf(myfoo.a, "%s", source_buf),
testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
ASSERT_EXIT(sprintf(myfoo.a, "0123456789"), ASSERT_EXIT(sprintf(myfoo.a, "0123456789"),
testing::KilledBySignal(SIGABRT), ""); 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, ...) { static int vsprintf_helper2(const char *fmt, ...) {
foo myfoo; foo myfoo;
va_list va; va_list va;
@ -65,16 +84,20 @@ static int vsprintf_helper2(const char *fmt, ...) {
return result; return result;
} }
TEST(Fortify2_DeathTest, vsprintf_fortified2) { TEST(DEATHTEST, vsprintf_fortified2) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), ""); 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, ...) { static int vsnprintf_helper2(const char *fmt, ...) {
foo myfoo; foo myfoo;
va_list va; va_list va;
@ -87,19 +110,24 @@ static int vsnprintf_helper2(const char *fmt, ...) {
return result; return result;
} }
TEST(Fortify2_DeathTest, vsnprintf_fortified2) { TEST(DEATHTEST, vsnprintf_fortified2) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsnprintf_helper2("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), ""); ASSERT_EXIT(vsnprintf_helper2("0123456789"), testing::KilledBySignal(SIGABRT), "");
} }
#endif
#if __BIONIC__ #if __BIONIC__
#ifndef __clang__
// zero sized target with "\0" source (should fail) // 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
char* src = strdup(""); char* src = strdup("");
@ -107,9 +135,13 @@ TEST(Fortify2_DeathTest, strcpy_fortified2) {
testing::KilledBySignal(SIGABRT), ""); testing::KilledBySignal(SIGABRT), "");
free(src); free(src);
} }
#endif
#ifndef __clang__
// zero sized target with longer source (should fail) // 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
char* src = strdup("1"); char* src = strdup("1");
@ -117,9 +149,13 @@ TEST(Fortify2_DeathTest, strcpy2_fortified2) {
testing::KilledBySignal(SIGABRT), ""); testing::KilledBySignal(SIGABRT), "");
free(src); free(src);
} }
#endif
#ifndef __clang__
// one byte target with longer source (should fail) // 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
char* src = strdup("12"); char* src = strdup("12");
@ -127,8 +163,12 @@ TEST(Fortify2_DeathTest, strcpy3_fortified2) {
testing::KilledBySignal(SIGABRT), ""); testing::KilledBySignal(SIGABRT), "");
free(src); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); memcpy(myfoo.a, "0123456789", sizeof(myfoo.a));
@ -136,8 +176,12 @@ TEST(Fortify2_DeathTest, strchr_fortified2) {
ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')), ASSERT_EXIT(printf("%s", strchr(myfoo.a, 'a')),
testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
memcpy(myfoo.a, "0123456789", 10); memcpy(myfoo.a, "0123456789", 10);
@ -145,8 +189,12 @@ TEST(Fortify2_DeathTest, strrchr_fortified2) {
ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')), ASSERT_EXIT(printf("%s", strrchr(myfoo.a, 'a')),
testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
strcpy(myfoo.a, "01"); strcpy(myfoo.a, "01");
@ -154,26 +202,35 @@ TEST(Fortify2_DeathTest, strlcpy_fortified2) {
ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n), ASSERT_EXIT(strlcpy(myfoo.one, myfoo.a, n),
testing::KilledBySignal(SIGABRT), ""); testing::KilledBySignal(SIGABRT), "");
} }
#endif #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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
size_t n = atoi("10"); // avoid compiler optimizations size_t n = atoi("10"); // avoid compiler optimizations
strncpy(myfoo.a, "012345678", n); strncpy(myfoo.a, "012345678", n);
ASSERT_EXIT(strncat(myfoo.a, "9", n), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
myfoo.a[0] = '\0'; myfoo.a[0] = '\0';
size_t n = atoi("10"); // avoid compiler optimizations size_t n = atoi("10"); // avoid compiler optimizations
ASSERT_EXIT(strncat(myfoo.a, "0123456789", n), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string 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), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char src[11]; char src[11];
strcpy(src, "0123456789"); strcpy(src, "0123456789");
@ -190,8 +250,9 @@ TEST(Fortify2_DeathTest, strcat_fortified2) {
myfoo.a[0] = '\0'; myfoo.a[0] = '\0';
ASSERT_EXIT(strcat(myfoo.a, src), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
memcpy(myfoo.a, "0123456789", sizeof(myfoo.a)); // unterminated string 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), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
foo myfoo; foo myfoo;
strcpy(myfoo.a, "012345678"); 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), ""); ASSERT_EXIT(snprintf(myfoo.b, n, "a%s", myfoo.a), testing::KilledBySignal(SIGABRT), "");
} }
/***********************************************************/ #endif /* defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE=2 */
/* TESTS BELOW HERE DUPLICATE TESTS FROM fortify1_test.cpp */
/***********************************************************/
#if __BIONIC__ #if __BIONIC__
// multibyte target where we over fill (should fail) // multibyte target where we over fill (should fail)
TEST(Fortify2_DeathTest, strcpy_fortified) { TEST(DEATHTEST, strcpy_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[10]; char buf[10];
char *orig = strdup("0123456789"); char *orig = strdup("0123456789");
@ -222,7 +281,7 @@ TEST(Fortify2_DeathTest, strcpy_fortified) {
} }
// zero sized target with "\0" source (should fail) // zero sized target with "\0" source (should fail)
TEST(Fortify2_DeathTest, strcpy2_fortified) { TEST(DEATHTEST, strcpy2_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[0]; char buf[0];
char *orig = strdup(""); char *orig = strdup("");
@ -231,7 +290,7 @@ TEST(Fortify2_DeathTest, strcpy2_fortified) {
} }
// zero sized target with longer source (should fail) // zero sized target with longer source (should fail)
TEST(Fortify2_DeathTest, strcpy3_fortified) { TEST(DEATHTEST, strcpy3_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[0]; char buf[0];
char *orig = strdup("1"); char *orig = strdup("1");
@ -240,7 +299,7 @@ TEST(Fortify2_DeathTest, strcpy3_fortified) {
} }
// one byte target with longer source (should fail) // one byte target with longer source (should fail)
TEST(Fortify2_DeathTest, strcpy4_fortified) { TEST(DEATHTEST, strcpy4_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[1]; char buf[1];
char *orig = strdup("12"); char *orig = strdup("12");
@ -248,28 +307,28 @@ TEST(Fortify2_DeathTest, strcpy4_fortified) {
free(orig); free(orig);
} }
TEST(Fortify2_DeathTest, strlen_fortified) { TEST(DEATHTEST, strlen_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[10]; char buf[10];
memcpy(buf, "0123456789", sizeof(buf)); memcpy(buf, "0123456789", sizeof(buf));
ASSERT_EXIT(printf("%d", strlen(buf)), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[10]; char buf[10];
memcpy(buf, "0123456789", sizeof(buf)); memcpy(buf, "0123456789", sizeof(buf));
ASSERT_EXIT(printf("%s", strchr(buf, 'a')), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[10]; char buf[10];
memcpy(buf, "0123456789", sizeof(buf)); memcpy(buf, "0123456789", sizeof(buf));
ASSERT_EXIT(printf("%s", strrchr(buf, 'a')), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char bufa[15]; char bufa[15];
char bufb[10]; char bufb[10];
@ -280,7 +339,7 @@ TEST(Fortify2_DeathTest, strlcpy_fortified) {
#endif #endif
TEST(Fortify2_DeathTest, sprintf_fortified) { TEST(DEATHTEST, sprintf_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[10]; char buf[10];
char source_buf[15]; char source_buf[15];
@ -288,7 +347,7 @@ TEST(Fortify2_DeathTest, sprintf_fortified) {
ASSERT_EXIT(sprintf(buf, "%s", source_buf), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[5]; char buf[5];
ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), ""); ASSERT_EXIT(sprintf(buf, "aaaaa"), testing::KilledBySignal(SIGABRT), "");
@ -305,12 +364,12 @@ static int vsprintf_helper(const char *fmt, ...) {
return result; return result;
} }
TEST(Fortify2_DeathTest, vsprintf_fortified) { TEST(DEATHTEST, vsprintf_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), ""); ASSERT_EXIT(vsprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
} }
@ -327,17 +386,17 @@ static int vsnprintf_helper(const char *fmt, ...) {
return result; return result;
} }
TEST(Fortify2_DeathTest, vsnprintf_fortified) { TEST(DEATHTEST, vsnprintf_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsnprintf_helper("%s", "0123456789"), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), ""); ASSERT_EXIT(vsnprintf_helper("0123456789"), testing::KilledBySignal(SIGABRT), "");
} }
TEST(Fortify2_DeathTest, strncat_fortified) { TEST(DEATHTEST, strncat_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[10]; char buf[10];
size_t n = atoi("10"); // avoid compiler optimizations 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), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[10]; char buf[10];
buf[0] = '\0'; buf[0] = '\0';
@ -353,7 +412,7 @@ TEST(Fortify2_DeathTest, strncat2_fortified) {
ASSERT_EXIT(strncat(buf, "0123456789", n), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char src[11]; char src[11];
strcpy(src, "0123456789"); strcpy(src, "0123456789");
@ -362,7 +421,7 @@ TEST(Fortify2_DeathTest, strcat_fortified) {
ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), ""); ASSERT_EXIT(strcat(buf, src), testing::KilledBySignal(SIGABRT), "");
} }
TEST(Fortify2_DeathTest, memmove_fortified) { TEST(DEATHTEST, memmove_fortified) {
::testing::FLAGS_gtest_death_test_style = "threadsafe"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char buf[20]; char buf[20];
strcpy(buf, "0123456789"); strcpy(buf, "0123456789");
@ -370,7 +429,7 @@ TEST(Fortify2_DeathTest, memmove_fortified) {
ASSERT_EXIT(memmove(buf + 11, buf, n), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char bufa[10]; char bufa[10];
char bufb[10]; char bufb[10];
@ -379,7 +438,7 @@ TEST(Fortify2_DeathTest, memcpy_fortified) {
ASSERT_EXIT(memcpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char bufa[15]; char bufa[15];
char bufb[10]; char bufb[10];
@ -388,7 +447,7 @@ TEST(Fortify2_DeathTest, strncpy_fortified) {
ASSERT_EXIT(strncpy(bufb, bufa, n), testing::KilledBySignal(SIGABRT), ""); 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"; ::testing::FLAGS_gtest_death_test_style = "threadsafe";
char bufa[15]; char bufa[15];
char bufb[10]; char bufb[10];
@ -396,3 +455,157 @@ TEST(Fortify2_DeathTest, snprintf_fortified) {
size_t n = strlen(bufa) + 1; size_t n = strlen(bufa) + 1;
ASSERT_EXIT(snprintf(bufb, n, "%s", bufa), testing::KilledBySignal(SIGABRT), ""); 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]);
}