From efd67feb07081097fc559ed3efa2236a430ea656 Mon Sep 17 00:00:00 2001 From: Timofey Solomko Date: Sat, 22 Oct 2022 18:42:44 +0300 Subject: [PATCH] [TAR] Handle PAX headers with non-utf8 values and values with newline characters For example, Apple's implementation of TAR on macOS produces such containers, which technically do not conform to the (informal) specifications. --- Sources/TAR/TarExtendedHeader.swift | 50 +++++++++++++++++++---------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/Sources/TAR/TarExtendedHeader.swift b/Sources/TAR/TarExtendedHeader.swift index b11da288..52ab7f54 100644 --- a/Sources/TAR/TarExtendedHeader.swift +++ b/Sources/TAR/TarExtendedHeader.swift @@ -29,27 +29,40 @@ struct TarExtendedHeader { var comment: String? init(_ data: Data) throws { - // Split header data into entries with "\n" (0x0A) character as a separator. - let entriesData = data.split(separator: 0x0A) - var unknownRecords = [String: String]() - - for entryData in entriesData where !entryData.isEmpty { - let entryDataSplit = entryData.split(separator: 0x20, maxSplits: 1, omittingEmptySubsequences: false) - - guard entryDataSplit.count == 2, - let lengthString = String(data: entryDataSplit[0], encoding: .utf8), - Int(lengthString) == entryData.count + 1 + var i = data.startIndex + while i < data.endIndex { + let lengthStartIndex = i + while data[i] != 0x20 { + i += 1 + } + guard let lengthString = String(data: data[lengthStartIndex..