Loading...
--- dyld/dyld-433.5/src/dyld_process_info.cpp
+++ dyld/dyld-421.1/src/dyld_process_info.cpp
@@ -227,22 +227,14 @@
if ( result != KERN_SUCCESS )
break;
if ( info.protection == (VM_PROT_READ|VM_PROT_EXECUTE) ) {
- // read start of vm region to verify it is a mach header
- mach_vm_size_t readSize = sizeof(mach_header_64);
- mach_header_64 mhBuffer;
- if ( mach_vm_read_overwrite(task, address, sizeof(mach_header_64), (vm_address_t)&mhBuffer, &readSize) != KERN_SUCCESS )
- continue;
- if ( (mhBuffer.magic != MH_MAGIC) && (mhBuffer.magic != MH_MAGIC_64) )
- continue;
- // now know the region is the start of a mach-o file
- if ( mhBuffer.filetype == MH_EXECUTE ) {
+ if ( mainExecutableAddress == 0 ) {
mainExecutableAddress = address;
int len = proc_regionfilename(pid, mainExecutableAddress, mainExecutablePathBuffer, PATH_MAX);
if ( len != 0 )
mainExecutablePathBuffer[len] = '\0';
++imageCount;
}
- else if ( mhBuffer.filetype == MH_DYLINKER ) {
+ else if ( dyldAddress == 0 ) {
dyldAddress = address;
int len = proc_regionfilename(pid, dyldAddress, dyldPathBuffer, PATH_MAX);
if ( len != 0 )
@@ -508,7 +500,7 @@
// Implementation that works with existing dyld data structures
-static dyld_process_info _dyld_process_info_create_inner(task_t task, uint64_t timestamp, kern_return_t* kr)
+dyld_process_info _dyld_process_info_create(task_t task, uint64_t timestamp, kern_return_t* kr)
{
if ( kr != NULL )
*kr = KERN_SUCCESS;
@@ -596,16 +588,10 @@
imageCount = MIN(imageCount, 8192);
// read image array
- if ( allImageInfo64.infoArray == 0 ) {
- // dyld is in middle of updating image list, try again
- return NULL;
- }
dyld_image_info_64 imageArray64[imageCount];
if ( kern_return_t r = mach_vm_read_overwrite(task, allImageInfo64.infoArray, imageArraySize, (vm_address_t)&imageArray64, &readSize) ) {
- // if image array moved, try whole thing again
- if ( kr != NULL ) {
+ if ( kr != NULL )
*kr = r;
- }
return NULL;
}
// normalize by expanding 32-bit image_infos into 64-bit ones
@@ -621,46 +607,9 @@
}
// create object based on local copy of all image infos and image array
- dyld_process_info result = dyld_process_info_base::make(task, allImageInfo64, imageArray64, kr);
-
- // verify nothing has changed by re-reading all_image_infos struct and checking timestamp
- if ( result != NULL ) {
- dyld_all_image_infos_64 allImageInfo64again;
- readSize = task_dyld_info.all_image_info_size;
- if ( kern_return_t r = mach_vm_read_overwrite(task, task_dyld_info.all_image_info_addr, task_dyld_info.all_image_info_size, (vm_address_t)&allImageInfo64again, &readSize) ) {
- if ( kr != NULL )
- *kr = r;
- free((void*)result);
- return NULL;
- }
- uint64_t doneTimeStamp = allImageInfo64again.infoArrayChangeTimestamp;
- if ( task_dyld_info.all_image_info_format == TASK_DYLD_ALL_IMAGE_INFO_32 ) {
- const dyld_all_image_infos_32* allImageInfo32 = (dyld_all_image_infos_32*)&allImageInfo64again;
- doneTimeStamp = allImageInfo32->infoArrayChangeTimestamp;
- }
- if ( allImageInfo64.infoArrayChangeTimestamp != doneTimeStamp ) {
- // image list has changed since we started reading it
- // throw out what we have and start over
- free((void*)result);
- result = nullptr;
- }
- }
-
- return result;
-}
-
-
-dyld_process_info _dyld_process_info_create(task_t task, uint64_t timestamp, kern_return_t* kr)
-{
- // Other process may be loading and unloading as we read its memory, which can cause a read failure
- // <rdar://problem30067343&29567679> Retry if something fails
- for (int i=0; i < 100; ++i) {
- if ( dyld_process_info result = _dyld_process_info_create_inner( task, timestamp, kr) )
- return result;
-
- }
- return NULL;
-}
+ return dyld_process_info_base::make(task, allImageInfo64, imageArray64, kr);
+}
+
void _dyld_process_info_get_state(dyld_process_info info, dyld_process_state_info* stateInfo)
{