Index: third_party/mach_override/mach_override.c |
diff --git a/third_party/mach_override/mach_override.c b/third_party/mach_override/mach_override.c |
index 46d21528c138cf88a6889761c1d8db712f15588d..85a75e5c2067d4f6458d669e8c4bb9ce0aa52ade 100644 |
--- a/third_party/mach_override/mach_override.c |
+++ b/third_party/mach_override/mach_override.c |
@@ -9,7 +9,6 @@ |
#endif |
#include <mach-o/dyld.h> |
-#include <mach/mach_host.h> |
#include <mach/mach_init.h> |
#include <mach/vm_map.h> |
#include <mach/vm_statistics.h> |
@@ -160,12 +159,10 @@ fixupInstructions( |
#if defined(__i386__) || defined(__x86_64__) |
mach_error_t makeIslandExecutable(void *address) { |
mach_error_t err = err_none; |
- vm_size_t pageSize; |
- host_page_size( mach_host_self(), &pageSize ); |
- uintptr_t page = (uintptr_t)address & ~(uintptr_t)(pageSize-1); |
+ uintptr_t page = (uintptr_t)address & ~(uintptr_t)(PAGE_SIZE - 1); |
int e = err_none; |
- e |= mprotect((void *)page, pageSize, PROT_EXEC | PROT_READ); |
- e |= msync((void *)page, pageSize, MS_INVALIDATE ); |
+ e |= mprotect((void *)page, PAGE_SIZE, PROT_EXEC | PROT_READ); |
+ e |= msync((void *)page, PAGE_SIZE, MS_INVALIDATE ); |
if (e) { |
err = err_cannot_override; |
} |
@@ -343,12 +340,11 @@ mach_override_ptr( |
#endif |
if ( !err ) |
atomic_mov64((uint64_t *)originalFunctionPtr, jumpRelativeInstruction); |
- |
- mach_error_t prot_err = err_none; |
+ mach_error_t prot_err = err_none; |
prot_err = vm_protect( mach_task_self(), |
(vm_address_t) originalFunctionPtr, 8, false, |
(VM_PROT_READ | VM_PROT_EXECUTE) ); |
- if (prot_err) fprintf(stderr, "err = %x %s:%d\n", prot_err, __FILE__, __LINE__); |
+ if(prot_err) fprintf(stderr, "err = %x %s:%d\n", prot_err, __FILE__, __LINE__); |
} |
#endif |
@@ -393,52 +389,46 @@ allocateBranchIsland( |
mach_error_t err = err_none; |
if( allocateHigh ) { |
- vm_size_t pageSize; |
- err = host_page_size( mach_host_self(), &pageSize ); |
- if( !err ) { |
- assert( sizeof( BranchIsland ) <= pageSize ); |
+ assert( sizeof( BranchIsland ) <= PAGE_SIZE ); |
+ vm_address_t page = 0; |
#if defined(__i386__) |
- vm_address_t page = 0; |
- mach_error_t err = vm_allocate( mach_task_self(), &page, pageSize, VM_FLAGS_ANYWHERE ); |
- if( err == err_none ) { |
- *island = (BranchIsland*) page; |
- return err_none; |
- } |
- return err; |
+ err = vm_allocate( mach_task_self(), &page, PAGE_SIZE, VM_FLAGS_ANYWHERE ); |
+ if( err == err_none ) |
+ *island = (BranchIsland*) page; |
#else |
#if defined(__ppc__) || defined(__POWERPC__) |
- vm_address_t first = 0xfeffffff; |
- vm_address_t last = 0xfe000000 + pageSize; |
+ vm_address_t first = 0xfeffffff; |
+ vm_address_t last = 0xfe000000 + PAGE_SIZE; |
#elif defined(__x86_64__) |
- vm_address_t first = ((uint64_t)originalFunctionAddress & ~(uint64_t)(((uint64_t)1 << 31) - 1)) | ((uint64_t)1 << 31); // start in the middle of the page? |
- vm_address_t last = 0x0; |
+ // 64-bit ASLR is in bits 13-28 |
+ vm_address_t first = ((uint64_t)originalFunctionAddress & ~( (0xFUL << 28) | (PAGE_SIZE - 1) ) ) | (0x1UL << 31); |
+ vm_address_t last = (uint64_t)originalFunctionAddress & ~((0x1UL << 32) - 1); |
#endif |
- vm_address_t page = first; |
- int allocated = 0; |
- vm_map_t task_self = mach_task_self(); |
- |
- while( !err && !allocated && page != last ) { |
+ page = first; |
+ int allocated = 0; |
+ vm_map_t task_self = mach_task_self(); |
- err = vm_allocate( task_self, &page, pageSize, 0 ); |
- if( err == err_none ) |
- allocated = 1; |
- else if( err == KERN_NO_SPACE ) { |
+ while( !err && !allocated && page != last ) { |
+ |
+ err = vm_allocate( task_self, &page, PAGE_SIZE, 0 ); |
+ if( err == err_none ) |
+ allocated = 1; |
+ else if( err == KERN_NO_SPACE ) { |
#if defined(__x86_64__) |
- page -= pageSize; |
+ page -= PAGE_SIZE; |
#else |
- page += pageSize; |
+ page += PAGE_SIZE; |
#endif |
- err = err_none; |
- } |
+ err = err_none; |
} |
- if( allocated ) |
- *island = (BranchIsland*) page; |
- else if( !allocated && !err ) |
- err = KERN_NO_SPACE; |
-#endif |
} |
+ if( allocated ) |
+ *island = (BranchIsland*) page; |
+ else if( !allocated && !err ) |
+ err = KERN_NO_SPACE; |
+#endif |
} else { |
void *block = malloc( sizeof( BranchIsland ) ); |
if( block ) |
@@ -471,14 +461,8 @@ freeBranchIsland( |
mach_error_t err = err_none; |
if( island->allocatedHigh ) { |
- vm_size_t pageSize; |
- err = host_page_size( mach_host_self(), &pageSize ); |
- if( !err ) { |
- assert( sizeof( BranchIsland ) <= pageSize ); |
- err = vm_deallocate( |
- mach_task_self(), |
- (vm_address_t) island, pageSize ); |
- } |
+ assert( sizeof( BranchIsland ) <= PAGE_SIZE ); |
+ err = vm_deallocate(mach_task_self(), (vm_address_t) island, PAGE_SIZE ); |
} else { |
free( island ); |
} |