@@ -421,8 +421,13 @@ extension MachOFile {
421
421
return nil
422
422
}
423
423
424
- let entries : DataSequence < DataInCodeEntry > = fileHandle. readDataSequence (
425
- offset: numericCast ( headerStartOffset) + numericCast( dataInCode. dataoff) ,
424
+ guard let data = _readLinkEditData (
425
+ offset: numericCast ( dataInCode. dataoff) ,
426
+ length: numericCast ( dataInCode. datasize)
427
+ ) else { return nil }
428
+
429
+ let entries : DataSequence < DataInCodeEntry > = . init(
430
+ data: data,
426
431
numberOfElements: numericCast ( dataInCode. datasize) / DataInCodeEntry. layoutSize
427
432
)
428
433
@@ -449,12 +454,13 @@ extension MachOFile {
449
454
guard let info = loadCommands. dyldChainedFixups else {
450
455
return nil
451
456
}
457
+ guard let fileSlice = _fileSliceForLinkEditData (
458
+ offset: numericCast ( info. dataoff) ,
459
+ length: numericCast ( info. datasize)
460
+ ) else { return nil }
452
461
453
462
return . init(
454
- fileSice: try ! fileHandle. fileSlice (
455
- offset: headerStartOffset + numericCast( info. dataoff) ,
456
- length: numericCast ( info. datasize)
457
- ) ,
463
+ fileSice: fileSlice,
458
464
isSwapped: isSwapped
459
465
)
460
466
}
@@ -508,11 +514,13 @@ extension MachOFile {
508
514
guard let info = loadCommands. codeSignature else {
509
515
return nil
510
516
}
517
+ guard let fileSlice = _fileSliceForLinkEditData (
518
+ offset: numericCast ( info. dataoff) ,
519
+ length: numericCast ( info. datasize)
520
+ ) else { return nil }
521
+
511
522
return . init(
512
- fileSice: try ! fileHandle. fileSlice (
513
- offset: headerStartOffset + numericCast( info. dataoff) ,
514
- length: numericCast ( info. datasize)
515
- )
523
+ fileSice: fileSlice
516
524
)
517
525
}
518
526
}
@@ -600,10 +608,10 @@ extension MachOFile {
600
608
}
601
609
602
610
extension MachOFile {
603
- internal func _readLinkEditData (
611
+ internal func _fileSliceForLinkEditData (
604
612
offset: Int , // linkedit_data_command->dataoff (linkedit.fileoff + x)
605
613
length: Int
606
- ) -> Data ? {
614
+ ) -> File . FileSlice ? {
607
615
let linkedit : ( any SegmentCommandProtocol ) ? = loadCommands. linkedit64 ?? loadCommands. linkedit
608
616
guard let linkedit else { return nil }
609
617
guard linkedit. fileOffset + linkedit. fileSize >= offset + length else { return nil }
@@ -621,17 +629,28 @@ extension MachOFile {
621
629
) else {
622
630
return nil
623
631
}
624
- return try ? segment. _file. readData (
632
+ return try ? segment. _file. fileSlice (
625
633
offset: numericCast ( fileOffset) - segment. offset,
626
634
length: length
627
635
)
628
636
} else {
629
- return try ? fileHandle. readData (
637
+ return try ? fileHandle. fileSlice (
630
638
offset: headerStartOffset + offset,
631
639
length: length
632
640
)
633
641
}
634
642
}
643
+
644
+ internal func _readLinkEditData(
645
+ offset: Int , // linkedit_data_command->dataoff (linkedit.fileoff + x)
646
+ length: Int
647
+ ) -> Data ? {
648
+ guard let fileSlice = _fileSliceForLinkEditData (
649
+ offset: offset,
650
+ length: length
651
+ ) else { return nil }
652
+ return try ? fileSlice. readAllData ( )
653
+ }
635
654
}
636
655
637
656
extension MachOFile {
0 commit comments