Skip to content

Commit

Permalink
Fix unsafe Data Range when extracting subdata (#27)
Browse files Browse the repository at this point in the history
  • Loading branch information
luizmb committed Oct 8, 2021
1 parent b15aa32 commit c3a9143
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 1 deletion.
4 changes: 3 additions & 1 deletion Sources/FoundationExtensions/Data/Data+Extensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ extension Numeric {
extension Data {

public func range(start: Int, length: Int) -> Data {
subdata(in: start..<start + length)
guard start < endIndex else { return Data() }
let end = Swift.min(endIndex, start + length)
return subdata(in: start ..< end)
}

public func readValue<T>() -> T {
Expand Down
38 changes: 38 additions & 0 deletions Tests/FoundationExtensionsTests/Data/DataExtensionsTests.swift
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit c3a9143

Please sign in to comment.