Skip to content

Commit 764a523

Browse files
authored
Merge pull request github#12367 from geoffw0/nsstring2
Swift: Additional NSString taint test cases
2 parents a1a2d7c + 730532f commit 764a523

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

swift/ql/test/library-tests/dataflow/taint/libraries/nsstring.swift

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class NSString : NSObject, NSCopying, NSMutableCopying {
128128
var removingPercentEncoding: String? { get { return "" } }
129129
}
130130

131-
class NSMutableString: NSString {
131+
class NSMutableString : NSString {
132132
func append(_ aString: String) {}
133133
func insert(_ aString: String, at loc: Int) {}
134134
func replaceCharacters(in range: NSRange, with aString: String) {}
@@ -454,3 +454,34 @@ func taintThroughInterpolatedStrings() {
454454
sink(arg: sourceNSString().standardizingPath) // $ tainted=454
455455
sink(arg: sourceNSString().removingPercentEncoding) // $ tainted=455
456456
}
457+
458+
extension String {
459+
// an artificial initializer for initializing a `String` from an `NSString`. This can be done
460+
// in real-world Swift, but probably involves bridging magic and one of the other initializers.
461+
init(_: NSString) { self.init() }
462+
}
463+
464+
func taintThroughConversions() {
465+
// these are best effort tests as there's bridging magic between `String` and `NSString` that
466+
// we can't easily stub.
467+
let str1 = sourceString()
468+
let str2 = NSString(string: str1)
469+
sink(arg: str2) // $ tainted=467
470+
let str3 = str1 as! NSString // in real-world Swift you can just use `as` here
471+
sink(arg: str3) // $ tainted=467
472+
473+
let str5 = sourceNSString()
474+
let str6 = String(str5)
475+
sink(arg: str6) // $ tainted=473
476+
let str7 = str5 as! String // in real-world Swift you can just use `as` here
477+
sink(arg: str7) // $ tainted=473
478+
}
479+
480+
func taintThroughData() {
481+
// additional tests through the `Data` class
482+
let str1 = sourceNSString()
483+
let data1 = str1.data(using: 0)!
484+
sink(arg: data1) // $ tainted=482
485+
let str2 = NSString(data: data1, encoding: 0)!
486+
sink(arg: str2) // $ tainted=482
487+
}

0 commit comments

Comments
 (0)