am 394df35e
: Merge "Reorganize FORTIFY_SOURCE tests."
* commit '394df35e641816a3b9f0e065840b673dec9c73e5': Reorganize FORTIFY_SOURCE tests.
This commit is contained in:
commit
2018cfa85d
@ -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 += bionic \
|
||||
bionic/libstdc++/include \
|
||||
external/stlport/stlport \
|
||||
external/gtest/include
|
||||
LOCAL_C_INCLUDES += $(fortify_c_includes)
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_SRC_FILES := $(fortify_test_files)
|
||||
LOCAL_MODULE := fortify2-tests-gcc
|
||||
LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DTEST_NAME=Fortify2_Gcc
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
LOCAL_C_INCLUDES += $(fortify_c_includes)
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_SRC_FILES := $(fortify_test_files)
|
||||
LOCAL_MODULE := fortify1-tests-clang
|
||||
LOCAL_CLANG := true
|
||||
LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -DTEST_NAME=Fortify1_Clang
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
LOCAL_C_INCLUDES += $(fortify_c_includes)
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_SRC_FILES := $(fortify_test_files)
|
||||
LOCAL_MODULE := fortify2-tests-clang
|
||||
LOCAL_CLANG := true
|
||||
LOCAL_CFLAGS += $(fortify_c_flags) -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -DTEST_NAME=Fortify2_Clang
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
LOCAL_C_INCLUDES += $(fortify_c_includes)
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
endif # !BUILD_TINY_ANDROID
|
||||
|
@ -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]);
|
||||
}
|
@ -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));
|
||||
}
|
@ -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));
|
||||
}
|
@ -14,13 +14,19 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#undef _FORTIFY_SOURCE
|
||||
#define _FORTIFY_SOURCE 2
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
// We have to say "DeathTest" here so gtest knows to run this test (which exits)
|
||||
// in its own process. Unfortunately, the C preprocessor doesn't give us an
|
||||
// easy way to concatenate strings, so we need to use the complicated method
|
||||
// below. *sigh*
|
||||
#define DEATHTEST_PASTER(name) name##_DeathTest
|
||||
#define DEATHTEST_EVALUATOR(name) DEATHTEST_PASTER(name)
|
||||
#define DEATHTEST DEATHTEST_EVALUATOR(TEST_NAME)
|
||||
|
||||
#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE == 2
|
||||
struct foo {
|
||||
char empty[0];
|
||||
char one[1];
|
||||
@ -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]);
|
||||
}
|
Loading…
Reference in New Issue
Block a user