From c3a914318356d7b82ab6a8a1d0c658d3e2b62928 Mon Sep 17 00:00:00 2001 From: Luiz Rodrigo Martins Barbosa Date: Fri, 8 Oct 2021 10:13:47 +0200 Subject: [PATCH] Fix unsafe Data Range when extracting subdata (#27) --- .../Data/Data+Extensions.swift | 4 +- .../Data/DataExtensionsTests.swift | 38 +++++++++++++++++++ .../{ => Data}/DataMD5Tests.swift | 0 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 Tests/FoundationExtensionsTests/Data/DataExtensionsTests.swift rename Tests/FoundationExtensionsTests/{ => Data}/DataMD5Tests.swift (100%) diff --git a/Sources/FoundationExtensions/Data/Data+Extensions.swift b/Sources/FoundationExtensions/Data/Data+Extensions.swift index f9c0f7f..433ea7f 100644 --- a/Sources/FoundationExtensions/Data/Data+Extensions.swift +++ b/Sources/FoundationExtensions/Data/Data+Extensions.swift @@ -34,7 +34,9 @@ extension Numeric { extension Data { public func range(start: Int, length: Int) -> Data { - subdata(in: start..() -> T { diff --git a/Tests/FoundationExtensionsTests/Data/DataExtensionsTests.swift b/Tests/FoundationExtensionsTests/Data/DataExtensionsTests.swift new file mode 100644 index 0000000..4646f90 --- /dev/null +++ b/Tests/FoundationExtensionsTests/Data/DataExtensionsTests.swift @@ -0,0 +1,38 @@ +// Copyright © 2021 Lautsprecher Teufel GmbH. All rights reserved. + +#if !os(watchOS) +import FoundationExtensions +import XCTest + +class DataExtensionsTests: XCTestCase { + func testDataInRangeSuccessfullyExtractSubdataInTheMiddle() { + let fullData = Data([0xDE, 0xAD, 0xBE, 0xFF]) + let partialData = fullData.range(start: 1, length: 1) + XCTAssertEqual(partialData, Data([0xAD])) + } + + func testDataInRangeSuccessfullyExtractSubdataAtTheEnd() { + let fullData = Data([0xDE, 0xAD, 0xBE, 0xFF]) + let partialData = fullData.range(start: 3, length: 1) + XCTAssertEqual(partialData, Data([0xFF])) + } + + func testDataOutOfRangeBecauseOfLengthABitTooLong() { + let fullData = Data([0xDE, 0xAD, 0xBE, 0xFF]) + let partialData = fullData.range(start: 3, length: 2) + XCTAssertEqual(partialData, Data([0xFF])) + } + + func testDataOutOfRangeBecauseOfLengthWayTooLong() { + let fullData = Data([0xDE, 0xAD, 0xBE, 0xFF]) + let partialData = fullData.range(start: 1, length: 10) + XCTAssertEqual(partialData, Data([0xAD, 0xBE, 0xFF])) + } + + func testDataOutOfRangeBecauseOfStart() { + let fullData = Data([0xDE, 0xAD, 0xBE, 0xFF]) + let partialData = fullData.range(start: 4, length: 1) + XCTAssertEqual(partialData, Data([])) + } +} +#endif diff --git a/Tests/FoundationExtensionsTests/DataMD5Tests.swift b/Tests/FoundationExtensionsTests/Data/DataMD5Tests.swift similarity index 100% rename from Tests/FoundationExtensionsTests/DataMD5Tests.swift rename to Tests/FoundationExtensionsTests/Data/DataMD5Tests.swift