Skip to content

Commit 63c71f0

Browse files
committed
Swift: Add tests of with* closure methods.
1 parent e011480 commit 63c71f0

File tree

1 file changed

+139
-0
lines changed
  • swift/ql/test/library-tests/dataflow/taint/libraries

1 file changed

+139
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
2+
// --- stubs ---
3+
4+
// --- tests ---
5+
6+
func source() -> UInt8 { return 0; }
7+
func source2() -> Int { return 0; }
8+
func sink(arg: Any) {}
9+
10+
func taintThroughClosurePointer() {
11+
var myArray1: [UInt8] = [1, 2, 3, 4]
12+
13+
myArray1[0] = source()
14+
sink(arg: myArray1)
15+
sink(arg: myArray1[0]) // $ tainted=13
16+
let return1 = myArray1.withUnsafeBytes({
17+
ptr1 in
18+
sink(arg: ptr1)
19+
sink(arg: ptr1[0]) // $ MISSING: tainted=13
20+
return source()
21+
})
22+
sink(arg: return1) // $ MISSING: tainted=20
23+
24+
// ---
25+
26+
var myArray2: [UInt8] = [1, 2, 3, 4]
27+
28+
myArray2[0] = source()
29+
sink(arg: myArray2)
30+
sink(arg: myArray2[0]) // $ tainted=28
31+
let return2 = myArray2.withUnsafeBufferPointer({
32+
ptr2 in
33+
sink(arg: ptr2)
34+
sink(arg: ptr2[0]) // $ MISSING: tainted=28
35+
return source()
36+
})
37+
sink(arg: return2) // $ MISSING: tainted=35
38+
}
39+
40+
func taintThroughMutablePointer() {
41+
var myArray1: [UInt8] = [1, 2, 3, 4]
42+
43+
sink(arg: myArray1)
44+
sink(arg: myArray1[0])
45+
let return1 = myArray1.withUnsafeMutableBufferPointer({
46+
buffer in
47+
buffer.update(repeating: source())
48+
sink(arg: buffer)
49+
sink(arg: buffer[0]) // $ MISSING: tainted=47
50+
sink(arg: buffer.baseAddress!.pointee) // $ MISSING: tainted=47
51+
return source()
52+
})
53+
sink(arg: return1) // $ MISSING: tainted=47
54+
sink(arg: myArray1)
55+
sink(arg: myArray1[0]) // $ MISSING: tainted=47
56+
57+
// ---
58+
59+
var myArray2: [UInt8] = [1, 2, 3, 4]
60+
61+
sink(arg: myArray2)
62+
sink(arg: myArray2[0])
63+
let return2 = myArray2.withUnsafeMutableBufferPointer({
64+
buffer in
65+
buffer.baseAddress!.pointee = source()
66+
sink(arg: buffer)
67+
sink(arg: buffer[0]) // $ MISSING: tainted=65
68+
sink(arg: buffer.baseAddress!.pointee) // $ MISSING: tainted=65
69+
return source()
70+
})
71+
sink(arg: return2) // $ MISSING: tainted=65
72+
sink(arg: myArray2)
73+
sink(arg: myArray2[0]) // $ MISSING: tainted=65
74+
75+
// ---
76+
77+
var myArray3: [UInt8] = [1, 2, 3, 4]
78+
79+
sink(arg: myArray3)
80+
sink(arg: myArray3[0])
81+
let return3 = myArray3.withContiguousMutableStorageIfAvailable({
82+
ptr in
83+
ptr.update(repeating: source())
84+
sink(arg: ptr)
85+
sink(arg: ptr[0]) // $ MISSING: tainted=83
86+
return source()
87+
})
88+
sink(arg: return3!) // $ MISSING: tainted=83
89+
sink(arg: myArray3)
90+
sink(arg: myArray3[0]) // $ MISSING: tainted=83
91+
92+
// ---
93+
94+
var myArray4: [UInt8] = [1, 2, 3, 4]
95+
var myArray5: [UInt8] = [5, 6, 7, 8]
96+
97+
myArray5[0] = source()
98+
sink(arg: myArray4)
99+
sink(arg: myArray4[0])
100+
sink(arg: myArray5)
101+
sink(arg: myArray5[0]) // $ tainted=97
102+
let return4 = myArray4.withUnsafeMutableBytes({
103+
ptr4 in
104+
let return5 = myArray5.withUnsafeBytes({
105+
ptr5 in
106+
sink(arg: ptr5)
107+
sink(arg: ptr5[0]) // $ MISSING: tainted=97
108+
ptr4.copyBytes(from: ptr5)
109+
sink(arg: ptr4)
110+
sink(arg: ptr4[0]) // $ MISSING: tainted=97
111+
return source()
112+
})
113+
sink(arg: return5) // $ MISSING: tainted=111
114+
return source()
115+
})
116+
sink(arg: return4) // $ MISSING: tainted=114
117+
sink(arg: myArray4)
118+
sink(arg: myArray4[0]) // $ MISSING: tainted=97
119+
sink(arg: myArray5)
120+
sink(arg: myArray5[0]) // $ tainted=97
121+
122+
// ---
123+
124+
var myMutableBuffer = UnsafeMutableBufferPointer<Int>.allocate(capacity: 1)
125+
myMutableBuffer.initialize(repeating: 1)
126+
127+
sink(arg: myMutableBuffer)
128+
sink(arg: myMutableBuffer[0])
129+
let return6 = myMutableBuffer.withContiguousMutableStorageIfAvailable({
130+
ptr in
131+
ptr.update(repeating: source2())
132+
sink(arg: ptr)
133+
sink(arg: ptr[0]) // $ MISSING: tainted=131
134+
return source()
135+
})
136+
sink(arg: return6!) // $ MISSING: tainted=134
137+
sink(arg: myMutableBuffer)
138+
sink(arg: myMutableBuffer[0]) // $ MISSING: tainted=131
139+
}

0 commit comments

Comments
 (0)