From cd9d69890488384ede064aec2e5c77b7cd813794 Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Tue, 4 Jun 2024 02:41:49 +0900 Subject: [PATCH 1/3] Improve reading of strings with unknown lengths. --- Sources/MachOKit/Extension/FileHandle+.swift | 17 +++++++++++++++++ .../Model/DyldCache/DyldCacheImageInfo.swift | 3 +-- .../DyldCache/DyldCacheImageTextInfo.swift | 3 +-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Sources/MachOKit/Extension/FileHandle+.swift b/Sources/MachOKit/Extension/FileHandle+.swift index 280e900..7085d38 100644 --- a/Sources/MachOKit/Extension/FileHandle+.swift +++ b/Sources/MachOKit/Extension/FileHandle+.swift @@ -158,6 +158,23 @@ extension FileHandle { return String(cString: data) } + @_spi(Support) + public func readString( + offset: UInt64, + step: UInt64 = 10 + ) -> String? { + var data = Data() + var offset = offset + while true { + let new = readData(offset: offset, size: Int(step)) + if new.contains(0) || new.isEmpty { break } + data.append(new) + offset += UInt64(new.count) + } + + return String(cString: data) + } + @_spi(Support) public func readData( offset: UInt64, diff --git a/Sources/MachOKit/Model/DyldCache/DyldCacheImageInfo.swift b/Sources/MachOKit/Model/DyldCache/DyldCacheImageInfo.swift index 172af47..8c8be85 100644 --- a/Sources/MachOKit/Model/DyldCache/DyldCacheImageInfo.swift +++ b/Sources/MachOKit/Model/DyldCache/DyldCacheImageInfo.swift @@ -20,8 +20,7 @@ extension DyldCacheImageInfo { /// - Returns: Path for image public func path(in cache: DyldCache) -> String? { cache.fileHandle.readString( - offset: numericCast(layout.pathFileOffset), - size: 1000 // FIXME + offset: numericCast(layout.pathFileOffset) ) } } diff --git a/Sources/MachOKit/Model/DyldCache/DyldCacheImageTextInfo.swift b/Sources/MachOKit/Model/DyldCache/DyldCacheImageTextInfo.swift index 5f7ae3f..4422d38 100644 --- a/Sources/MachOKit/Model/DyldCache/DyldCacheImageTextInfo.swift +++ b/Sources/MachOKit/Model/DyldCache/DyldCacheImageTextInfo.swift @@ -25,8 +25,7 @@ extension DyldCacheImageTextInfo { /// - Returns: Path for image text public func path(in cache: DyldCache) -> String? { cache.fileHandle.readString( - offset: numericCast(layout.pathOffset), - size: 1000 // FIXME + offset: numericCast(layout.pathOffset) ) } } From 657891c6c7470b4ba4c2ace3a234c22c3533a40f Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:57:33 +0900 Subject: [PATCH 2/3] Fix --- Sources/MachOKit/Extension/FileHandle+.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/MachOKit/Extension/FileHandle+.swift b/Sources/MachOKit/Extension/FileHandle+.swift index 7085d38..32fd1d2 100644 --- a/Sources/MachOKit/Extension/FileHandle+.swift +++ b/Sources/MachOKit/Extension/FileHandle+.swift @@ -167,8 +167,9 @@ extension FileHandle { var offset = offset while true { let new = readData(offset: offset, size: Int(step)) - if new.contains(0) || new.isEmpty { break } + if new.isEmpty { break } data.append(new) + if new.contains(0) { break } offset += UInt64(new.count) } From 1b21b68ac1380869915e3f084117cc394cc49f7e Mon Sep 17 00:00:00 2001 From: p-x9 <50244599+p-x9@users.noreply.github.com> Date: Thu, 13 Jun 2024 15:09:46 +0900 Subject: [PATCH 3/3] Refactor null terminated string reading --- Sources/MachOKit/Extension/UnsafePointer+.swift | 9 +++++++++ Sources/MachOKit/MachOFile+Strings.swift | 9 +++------ Sources/MachOKit/MachOImage+Strings.swift | 5 ++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Sources/MachOKit/Extension/UnsafePointer+.swift b/Sources/MachOKit/Extension/UnsafePointer+.swift index fd0cb11..61ed842 100644 --- a/Sources/MachOKit/Extension/UnsafePointer+.swift +++ b/Sources/MachOKit/Extension/UnsafePointer+.swift @@ -62,3 +62,12 @@ extension UnsafePointer { return (string, offset) } } + +extension UnsafePointer { + func readString() -> (String, Int) { + let offset = Int(bitPattern: strchr(self, 0)) + 1 - Int(bitPattern: self) + let string = String(cString: self) + + return (string, offset) + } +} diff --git a/Sources/MachOKit/MachOFile+Strings.swift b/Sources/MachOKit/MachOFile+Strings.swift index 5013e3c..946e075 100644 --- a/Sources/MachOKit/MachOFile+Strings.swift +++ b/Sources/MachOKit/MachOFile+Strings.swift @@ -60,15 +60,12 @@ extension MachOFile.Strings { let ptr = baseAddress .advanced(by: nextOffset) - .assumingMemoryBound(to: CChar.self) - let string = String(cString: ptr) - - let nextPointer = UnsafePointer(strchr(ptr, 0)) - .advanced(by: 1) + .assumingMemoryBound(to: UInt8.self) + let (string, offset) = ptr.readString() let result = Element(string: string, offset: nextOffset) - nextOffset += Int(bitPattern: nextPointer) - Int(bitPattern: ptr) + nextOffset += offset return result } diff --git a/Sources/MachOKit/MachOImage+Strings.swift b/Sources/MachOKit/MachOImage+Strings.swift index 6a28caf..93a9bdc 100644 --- a/Sources/MachOKit/MachOImage+Strings.swift +++ b/Sources/MachOKit/MachOImage+Strings.swift @@ -72,9 +72,8 @@ extension MachOImage.Strings { if offset >= tableSize { return nil } - let string = String(cString: nextPointer) - nextPointer = UnsafePointer(strchr(nextPointer, 0)) - .advanced(by: 1) + let (string, nextOffset) = nextPointer.readString() + nextPointer = nextPointer.advanced(by: nextOffset) return .init(string: string, offset: offset) }