[SR-6398] Ensure CFSTR() is CFRetained because it is not permanent on Linux. (#1351)
diff --git a/CoreFoundation/URL.subproj/CFURLComponents.c b/CoreFoundation/URL.subproj/CFURLComponents.c
index 86dd9f1..ee1fa7d 100644
--- a/CoreFoundation/URL.subproj/CFURLComponents.c
+++ b/CoreFoundation/URL.subproj/CFURLComponents.c
@@ -63,7 +63,7 @@
static Boolean __CFURLComponentsEqual(CFTypeRef left, CFTypeRef right);
static CFStringRef __CFURLComponentsCopyDescription(CFTypeRef cf) {
- return CFSTR("A really nice CFURLComponents object");
+ return CFRetain(CFSTR("A really nice CFURLComponents object"));
}
CF_SWIFT_EXPORT void __CFURLComponentsDeallocate(CFURLComponentsRef instance) {
@@ -1054,7 +1054,7 @@
}
}
else {
- nameString = CFSTR("");
+ nameString = (CFStringRef)CFRetain(CFSTR(""));
}
nameRange.location = kCFNotFound;
valueRange.location = idx + 1;
@@ -1076,7 +1076,7 @@
}
}
else {
- valueString = CFSTR("");
+ valueString = (CFStringRef)CFRetain(CFSTR(""));
}
CFStringRef name = CFSTR("name");
CFTypeRef keys[] = {name, CFSTR("value")};
@@ -1101,7 +1101,7 @@
}
}
else {
- nameString = CFSTR("");
+ nameString = (CFStringRef)CFRetain(CFSTR(""));
}
CFStringRef name = CFSTR("name");
CFTypeRef keys[] = {name};
@@ -1131,7 +1131,7 @@
}
}
else {
- valueString = CFSTR("");
+ valueString = (CFStringRef)CFRetain(CFSTR(""));
}
CFStringRef name = CFSTR("name");
CFTypeRef keys[] = {name, CFSTR("value")};
@@ -1155,7 +1155,7 @@
}
}
else {
- nameString = CFSTR("");
+ nameString = (CFStringRef)CFRetain(CFSTR(""));
}
CFStringRef name = CFSTR("name");
CFTypeRef keys[] = {name};
diff --git a/TestFoundation/TestURL.swift b/TestFoundation/TestURL.swift
index e500dd1..f0c809d 100644
--- a/TestFoundation/TestURL.swift
+++ b/TestFoundation/TestURL.swift
@@ -525,6 +525,7 @@
class TestURLComponents : XCTestCase {
static var allTests: [(String, (TestURLComponents) -> () throws -> Void)] {
return [
+ ("test_queryItems", test_queryItems),
("test_string", test_string),
("test_port", test_portSetter),
("test_url", test_url),
@@ -535,6 +536,19 @@
]
}
+ func test_queryItems() {
+ let urlString = "http://localhost:8080/foo?bar=&bar=baz"
+ let url = URL(string: urlString)!
+
+ let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
+
+ var query = [String: String]()
+ components?.queryItems?.forEach {
+ query[$0.name] = $0.value ?? ""
+ }
+ XCTAssertEqual(["bar": "baz"], query)
+ }
+
func test_string() {
for obj in getTestData()! {
let testDict = obj as! [String: Any]