未验证 提交 feb8d6dc 编写于 作者: C ChasonTang 提交者: GitHub

fix(iOS): vm_protect() force shared library const data copy memory page (#932)

上级 9657a5bd
......@@ -7,7 +7,7 @@
Pod::Spec.new do |s|
s.name = 'DoraemonKit'
s.version = '3.1.1'
s.version = '3.1.2'
s.summary = 'iOS各式各样的工具集合'
s.description = <<-DESC
iOS各式各样的工具集合 Desc
......
......@@ -97,35 +97,13 @@ static void doraemon_perform_rebinding_with_section(struct doraemon_rebindings_e
const bool isDataConst = strcmp(section->segname, "__DATA_CONST") == 0;
uint32_t *indirect_symbol_indices = indirect_symtab + section->reserved1;
void **indirect_symbol_bindings = (void **)((uintptr_t)slide + section->addr);
vm_prot_t oldProtection = VM_PROT_NONE;
vm_address_t vmAddress = (vm_address_t)indirect_symbol_bindings;
// https://opensource.apple.com/source/xnu/xnu-7195.141.2/osfmk/vm/vm_user.c.auto.html
// OUT argument, but init with zero to eliminate `Variable 'vmSize' may be uninitialized when used here` warning
vm_size_t vmSize = 0;
if (isDataConst) {
memory_object_name_t object;
#ifdef __LP64__
mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64;
vm_region_basic_info_data_64_t vmRegionBasicInfoData;
kern_return_t kernelReturn = vm_region_64(mach_task_self(), &vmAddress, &vmSize, VM_REGION_BASIC_INFO_64, (vm_region_info_t)&vmRegionBasicInfoData, &count, &object);
#else
mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT;
vm_region_basic_info_data_t vmRegionBasicInfoData;
kern_return_t kernelReturn = vm_region(mach_task_self(), &vmAddress, &vmSize, VM_REGION_BASIC_INFO, (vm_region_info_t)&vmRegionBasicInfoData, &count, object);
#endif
if (__builtin_expect(kernelReturn == KERN_SUCCESS, true)) {
oldProtection = vmRegionBasicInfoData.protection;
} else {
assert(false && "vm_region() failure.");
return;
}
kernelReturn = vm_protect(mach_task_self(), vmAddress, vmSize, false, oldProtection | VM_PROT_WRITE);
if (__builtin_expect(kernelReturn != KERN_SUCCESS, false)) {
assert(false && "vm_protect() failure.");
kern_return_t kernelReturn = vm_protect(mach_task_self(), (vm_address_t)indirect_symbol_bindings, section->size, false, VM_PROT_READ | VM_PROT_WRITE | VM_PROT_COPY);
if (__builtin_expect(kernelReturn != KERN_SUCCESS, false)) {
assert(false && "vm_protect() failure.");
return;
}
return;
}
}
for (uint i = 0; i < section->size / sizeof(void *); i++) {
uint32_t symtab_index = indirect_symbol_indices[i];
......@@ -147,16 +125,13 @@ static void doraemon_perform_rebinding_with_section(struct doraemon_rebindings_e
}
indirect_symbol_bindings[i] = cur->rebindings[j].replacement;
goto symbol_loop;
}
}
cur = cur->next;
}
symbol_loop:;
}
if (isDataConst) {
kern_return_t kernelReturn = vm_protect(mach_task_self(), vmAddress, vmSize, false, oldProtection);
assert(kernelReturn == KERN_SUCCESS && "vm_protect() failure.");
}
}
static void doraemon_rebind_symbols_for_image(struct doraemon_rebindings_entry *rebindings,
......
......@@ -14,9 +14,9 @@ PODS:
- AFNetworking/Serialization (4.0.1)
- AFNetworking/UIKit (4.0.1):
- AFNetworking/NSURLSession
- DoraemonKit (3.1.0):
- DoraemonKit/Core (= 3.1.0)
- DoraemonKit/Core (3.1.0):
- DoraemonKit (3.1.2):
- DoraemonKit/Core (= 3.1.2)
- DoraemonKit/Core (3.1.2):
- AFNetworking
- FMDB
- GCDWebServer
......@@ -48,7 +48,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
AFNetworking: 7864c38297c79aaca1500c33288e429c3451fdce
DoraemonKit: 6db7868ed839ad6752c2e4ac074f958aab211af2
DoraemonKit: 0a040ae24386654e2a2d2c8d029f5ff5837de3c3
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GCDWebServer: 2c156a56c8226e2d5c0c3f208a3621ccffbe3ce4
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册