From 03d5386e581f29e6d97b5f745582afd7ae890c1d Mon Sep 17 00:00:00 2001 From: Leo Mehlig Date: Sun, 3 Sep 2023 08:37:52 +0200 Subject: [PATCH] Fix infinite recursion when casting `AnySerializable` to wrong type (#147) --- Sources/Defaults/Utilities.swift | 2 +- Tests/DefaultsTests/DefaultsAnySeriliazableTests.swift | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Sources/Defaults/Utilities.swift b/Sources/Defaults/Utilities.swift index aaaee5e..357e0c6 100644 --- a/Sources/Defaults/Utilities.swift +++ b/Sources/Defaults/Utilities.swift @@ -194,7 +194,7 @@ extension Defaults.Serializable { return anyObject } - guard let nextType = T.Serializable.self as? any Defaults.Serializable.Type else { + guard let nextType = T.Serializable.self as? any Defaults.Serializable.Type, nextType != T.self else { // This is a special case for the types which do not conform to `Defaults.Serializable` (for example, `Any`). return T.bridge.deserialize(anyObject as? T.Serializable) as? T } diff --git a/Tests/DefaultsTests/DefaultsAnySeriliazableTests.swift b/Tests/DefaultsTests/DefaultsAnySeriliazableTests.swift index b0f4017..a0f9e61 100644 --- a/Tests/DefaultsTests/DefaultsAnySeriliazableTests.swift +++ b/Tests/DefaultsTests/DefaultsAnySeriliazableTests.swift @@ -466,4 +466,10 @@ final class DefaultsAnySerializableTests: XCTestCase { waitForExpectations(timeout: 10) } + + func testWrongCast() { + let value = Defaults.AnySerializable(false) + XCTAssertEqual(value.get(Bool.self), false) + XCTAssertNil(value.get(String.self)) + } }