From a125addd56ed998b95fe7e3962f5cb3759332700 Mon Sep 17 00:00:00 2001 From: Simon Evans Date: Tue, 8 Aug 2017 23:48:19 +0100 Subject: [PATCH] SR-5557: Fix NSRegularExpression errors with invalid pattern - The error dictionary in CFRegularExpression was failing with the error key being a CFSTR inside an array so initialiase it outside of the array. --- CoreFoundation/String.subproj/CFRegularExpression.c | 5 +++-- Foundation/NSRegularExpression.swift | 2 +- TestFoundation/TestNSRegularExpression.swift | 11 +++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CoreFoundation/String.subproj/CFRegularExpression.c b/CoreFoundation/String.subproj/CFRegularExpression.c index 71a121df45..79a1d96b4d 100644 --- a/CoreFoundation/String.subproj/CFRegularExpression.c +++ b/CoreFoundation/String.subproj/CFRegularExpression.c @@ -133,8 +133,9 @@ _CFRegularExpressionRef _CFRegularExpressionCreate(CFAllocatorRef allocator, CFS if (regex == NULL || U_FAILURE(errorCode)) { // ??? do we need more detailed errors here? if (errorPtr) { - CFStringRef keys[] = { - CFSTR("NSInvalidValue") + CFStringRef key = CFSTR("NSInvalidValue"); + CFTypeRef keys[] = { + key }; CFTypeRef values[] = { pattern diff --git a/Foundation/NSRegularExpression.swift b/Foundation/NSRegularExpression.swift index ea384daa36..81209e3424 100644 --- a/Foundation/NSRegularExpression.swift +++ b/Foundation/NSRegularExpression.swift @@ -85,7 +85,7 @@ open class NSRegularExpression: NSObject, NSCopying, NSCoding { if let regex = _CFRegularExpressionCreate(kCFAllocatorSystemDefault, pattern._cfObject, opt, &error) { _internal = regex } else { - throw error!.takeRetainedValue()._nsObject + throw error!.takeRetainedValue() } } diff --git a/TestFoundation/TestNSRegularExpression.swift b/TestFoundation/TestNSRegularExpression.swift index cb1a4a6b6e..59b2ff0f56 100644 --- a/TestFoundation/TestNSRegularExpression.swift +++ b/TestFoundation/TestNSRegularExpression.swift @@ -29,6 +29,7 @@ class TestNSRegularExpression : XCTestCase { ("test_Equal", test_Equal), ("test_NSCoding", test_NSCoding), ("test_defaultOptions", test_defaultOptions), + ("test_badPattern", test_badPattern), ] } @@ -372,4 +373,14 @@ class TestNSRegularExpression : XCTestCase { let str = NSMutableString(string: text) XCTAssertEqual(regex!.replaceMatches(in: str, range: range, withTemplate: "$1-$2-$3"), 1) } + + func test_badPattern() { + do { + _ = try NSRegularExpression(pattern: "(", options: []) + XCTFail() + } catch { + let err = String(describing: error) + XCTAssertEqual(err, "Error Domain=NSCocoaErrorDomain Code=2048 \"(null)\" UserInfo={NSInvalidValue=(}") + } + } }