Loading...
framework/MachTask.swift dyld-1340 dyld-1284.13
--- dyld/dyld-1340/framework/MachTask.swift
+++ dyld/dyld-1284.13/framework/MachTask.swift
@@ -21,8 +21,6 @@
  *
  * @APPLE_LICENSE_HEADER_END@
  */
-
-@_implementationOnly import Dyld_Internal
 
 // We implement this a ~Copyable even though it ref counted because the ref count are syscalls, and thus very expensive. When we do need to copy
 // we will do it explicitly via a borrowing constructor.
@@ -66,32 +64,36 @@
         }
         return result
     }
-    func readStruct<T>(address: RemoteAddress) throws(AtlasError) -> T {
-        var vmSize = mach_msg_type_number_t(0)
-        var bufferPtrScalar: vm_offset_t = 0
-        let kr = vm_read_safe(self.port, address.value, mach_vm_size_t(MemoryLayout<T>.size), &bufferPtrScalar, &vmSize)
+    func readStruct<T>(address: RebasedAddress) throws(AtlasError) -> T {
+        let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount:MemoryLayout<T>.size, alignment:MemoryLayout<T>.alignment)
+        defer {
+            buffer.deallocate()
+        }
+        guard let baseAddress = buffer.baseAddress else {
+            throw AtlasError.machError(KERN_RESOURCE_SHORTAGE)
+        }
+        var vmSize = vm_size_t(0)
+        let kr = vm_read_overwrite(self.port, vm_address_t(address.value), vm_size_t(MemoryLayout<T>.size), vm_address_t(UInt(bitPattern:baseAddress)), &vmSize)
         guard kr == KERN_SUCCESS else {
             throw AtlasError.machError(kr)
-        }
-        defer {
-            vm_deallocate(mach_task_self_, bufferPtrScalar, vm_size_t(vmSize))
         }
         guard vmSize >= MemoryLayout<T>.size else {
             throw AtlasError.placeHolder
         }
-        let bufferPtr = UnsafeMutableRawPointer(bitPattern: Int(bitPattern: UInt(bufferPtrScalar)))
-        let buffer = UnsafeMutableRawBufferPointer(start:bufferPtr, count:Int(MemoryLayout<T>.size))
         return buffer.load(as:T.self)
     }
-    func readData(address: RemoteAddress, size: UInt64) throws(AtlasError) -> Data {
-        var vmSize = mach_msg_type_number_t(0)
-        var bufferPtrScalar: vm_offset_t = 0
-        let kr = vm_read_safe(self.port, address.value, size, &bufferPtrScalar, &vmSize)
+    func readData(address: RebasedAddress, size: UInt64) throws(AtlasError) -> Data {
+        var result = Data(count:Int(size))
+        var vmSize = vm_size_t(size)
+        let kr = result.withUnsafeMutableBytes {
+            return vm_read_overwrite(self.port, vm_address_t(address.value), vm_size_t(size), vm_address_t(UInt(bitPattern:$0.baseAddress!)), &vmSize)
+        }
         guard kr == KERN_SUCCESS else {
-            throw AtlasError.machError(kr)
+            throw .machError(kr)
         }
-        let bufferPtr = UnsafeMutableRawPointer(bitPattern: Int(bitPattern: UInt(bufferPtrScalar)))
-
-        return Data(bytesNoCopy:bufferPtr!, count:Int(vmSize), deallocator:.virtualMemory)
+        guard vmSize >= size else {
+            throw .truncatedVMRead
+        }
+        return result
     }
 }