X-Git-Url: https://git.saurik.com/apple/dyld.git/blobdiff_plain/bac542e65c0030c0d819c7ff1dcfc25892a61844..19894a1236eae932b4028640f24ab843f691d4e4:/unit-tests/test-cases/dlopen-from-anonymous-code/main.c?ds=inline diff --git a/unit-tests/test-cases/dlopen-from-anonymous-code/main.c b/unit-tests/test-cases/dlopen-from-anonymous-code/main.c index 8dfe72f..e208e14 100644 --- a/unit-tests/test-cases/dlopen-from-anonymous-code/main.c +++ b/unit-tests/test-cases/dlopen-from-anonymous-code/main.c @@ -26,6 +26,7 @@ #include #include // sys_icache_invalidate #include // for mprotext +#include #include "test.h" // PASS(), FAIL(), XPASS(), XFAIL() @@ -36,18 +37,33 @@ void* calldlopen(const char* path, int mode, void* (*dlopen_proc)(const char* pa return (*dlopen_proc)(path, mode); } +#if __thumb__ + #define START_OF_FUNC(x) ((void*)((long)x & (-2))) + #define ADDR_FROM_BLOCK(x) ((void*)((long)x | 1)) +#else + #define START_OF_FUNC(x) (x) + #define ADDR_FROM_BLOCK(x) (x) +#endif + // // try calling dlopen() from code not owned by dyld // int main() { - void* codeBlock = malloc(4096); - memcpy(codeBlock, &calldlopen, 4096); + // now try to create a page where foo() was + vm_address_t addr = 0; + kern_return_t r = vm_allocate(mach_task_self(), &addr, 4096, VM_FLAGS_ANYWHERE); + if ( r != KERN_SUCCESS ) { + FAIL("vm_allocate returned %d", r); + return 0; + } + void* codeBlock = (void*)(addr); + memcpy(codeBlock, START_OF_FUNC(calldlopen), 4096); sys_icache_invalidate(codeBlock, 4096); mprotect(codeBlock, 4096, PROT_READ | PROT_EXEC); //fprintf(stderr, "codeBlock=%p\n", codeBlock); - void* (*caller)(const char* path, int mode, void* (*dlopen_proc)(const char* path, int mode)) = codeBlock; + void* (*caller)(const char* path, int mode, void* (*dlopen_proc)(const char* path, int mode)) = ADDR_FROM_BLOCK(codeBlock); void* handle = (*caller)("foo.bundle", RTLD_LAZY, &dlopen); if ( handle == NULL ) {