Extend cfi test to verify a range of target pointers.
Test: bionic device tests Bug: 63400743 Bug: 65590288 Change-Id: Ic4ef9630a2db709cf4edcc7f76c791df3f349192
This commit is contained in:
parent
0d9301e156
commit
1dfd76ac2c
|
@ -22,6 +22,10 @@
|
|||
#include "gtest_globals.h"
|
||||
#include "utils.h"
|
||||
|
||||
#if defined(__BIONIC__)
|
||||
#include "private/CFIShadow.h"
|
||||
#endif
|
||||
|
||||
// Private libdl interface.
|
||||
extern "C" {
|
||||
void __cfi_slowpath(uint64_t CallSiteTypeId, void* Ptr);
|
||||
|
@ -40,15 +44,16 @@ TEST(cfi_test, basic) {
|
|||
EXPECT_NE(0U, __cfi_shadow_size());
|
||||
|
||||
#define SYM(type, name) auto name = reinterpret_cast<type>(dlsym(handle, #name))
|
||||
SYM(int (*)(), get_count);
|
||||
SYM(size_t (*)(), get_count);
|
||||
SYM(uint64_t(*)(), get_last_type_id);
|
||||
SYM(void* (*)(), get_last_address);
|
||||
SYM(void* (*)(), get_last_diag);
|
||||
SYM(void* (*)(), get_global_address);
|
||||
SYM(void (*)(uint64_t, void*, void*), __cfi_check);
|
||||
SYM(char*, bss);
|
||||
#undef SYM
|
||||
|
||||
int c = get_count();
|
||||
size_t c = get_count();
|
||||
|
||||
// CFI check for code inside the DSO. Can't use just any function address - this is only
|
||||
// guaranteed to work for code addresses above __cfi_check.
|
||||
|
@ -88,6 +93,14 @@ TEST(cfi_test, basic) {
|
|||
EXPECT_DEATH(__cfi_slowpath(46, p), "");
|
||||
free(p);
|
||||
|
||||
// Check all the addresses.
|
||||
const size_t bss_size = 1024 * 1024;
|
||||
static_assert(bss_size >= kLibraryAlignment * 2, "test range not big enough");
|
||||
for (size_t i = 0; i < bss_size; ++i) {
|
||||
__cfi_slowpath(47, bss + i);
|
||||
EXPECT_EQ(++c, get_count());
|
||||
}
|
||||
|
||||
// Load the same library again.
|
||||
void* handle2 = dlopen("libcfi-test.so", RTLD_NOW | RTLD_LOCAL);
|
||||
ASSERT_TRUE(handle2 != nullptr) << dlerror();
|
||||
|
|
|
@ -22,13 +22,16 @@
|
|||
// present. But it is only used in the bionic loader tests.
|
||||
extern "C" __attribute__((weak)) void __cfi_slowpath(uint64_t, void*);
|
||||
|
||||
static int g_count;
|
||||
static size_t g_count;
|
||||
static uint64_t g_last_type_id;
|
||||
static void* g_last_address;
|
||||
static void* g_last_diag;
|
||||
|
||||
extern "C" {
|
||||
|
||||
// Make sure the library crosses at least one kLibraryAlignment(=256KB) boundary.
|
||||
char bss[1024 * 1024];
|
||||
|
||||
// Mock a CFI-enabled library without relying on the compiler.
|
||||
__attribute__((aligned(4096))) void __cfi_check(uint64_t CallSiteTypeId, void* TargetAddr,
|
||||
void* Diag) {
|
||||
|
@ -38,7 +41,7 @@ __attribute__((aligned(4096))) void __cfi_check(uint64_t CallSiteTypeId, void* T
|
|||
g_last_diag = Diag;
|
||||
}
|
||||
|
||||
int get_count() {
|
||||
size_t get_count() {
|
||||
return g_count;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue