[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]