Skip to content

Commit 15227d3

Browse files
committed
Swift: Add tests where a user-defined (non-modelled) function taints the pointee of a pointer argument.
1 parent a1a2d7c commit 15227d3

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
2+
// --- stubs ---
3+
4+
func sourceString() -> String { return "" }
5+
func sourceUInt8() -> UInt8 { return 0 }
6+
func sink(arg: Any) {}
7+
8+
// --- tests ---
9+
10+
func clearPointer1(ptr: UnsafeMutablePointer<String>) {
11+
ptr.pointee = "abc"
12+
13+
sink(arg: ptr.pointee)
14+
sink(arg: ptr)
15+
}
16+
17+
func taintPointer(ptr: UnsafeMutablePointer<String>) {
18+
sink(arg: ptr.pointee)
19+
sink(arg: ptr)
20+
21+
ptr.pointee = sourceString()
22+
23+
sink(arg: ptr.pointee) // $ tainted=21
24+
sink(arg: ptr)
25+
}
26+
27+
func clearPointer2(ptr: UnsafeMutablePointer<String>) {
28+
sink(arg: ptr.pointee) // $ MISSING: tainted=21
29+
sink(arg: ptr)
30+
31+
ptr.pointee = "abc"
32+
33+
sink(arg: ptr.pointee)
34+
sink(arg: ptr)
35+
}
36+
37+
func testMutatingPointerInCall(ptr: UnsafeMutablePointer<String>) {
38+
clearPointer1(ptr: ptr)
39+
40+
sink(arg: ptr.pointee)
41+
sink(arg: ptr)
42+
43+
taintPointer(ptr: ptr) // mutates `ptr` pointee with a tainted value
44+
45+
sink(arg: ptr.pointee) // $ MISSING: tainted=21
46+
sink(arg: ptr)
47+
48+
clearPointer2(ptr: ptr)
49+
50+
sink(arg: ptr.pointee)
51+
sink(arg: ptr)
52+
}
53+
54+
// ---
55+
56+
func taintBuffer(buffer: UnsafeMutableBufferPointer<UInt8>) {
57+
sink(arg: buffer[0])
58+
sink(arg: buffer)
59+
60+
buffer[0] = sourceUInt8()
61+
62+
sink(arg: buffer[0]) // $ MISSING: tainted=60
63+
sink(arg: buffer)
64+
}
65+
66+
func testMutatingBufferInCall(ptr: UnsafeMutablePointer<UInt8>) {
67+
let buffer = UnsafeMutableBufferPointer<UInt8>(start: ptr, count: 1000)
68+
69+
sink(arg: buffer[0])
70+
sink(arg: buffer)
71+
72+
taintBuffer(buffer: buffer) // mutates `buffer` contents with a tainted value
73+
74+
sink(arg: buffer[0]) // $ MISSING: tainted=60
75+
sink(arg: buffer)
76+
77+
}
78+
79+
// ---
80+
81+
typealias MyPointer = UnsafeMutablePointer<String>
82+
83+
func taintMyPointer(ptr: MyPointer) {
84+
sink(arg: ptr.pointee)
85+
sink(arg: ptr)
86+
87+
ptr.pointee = sourceString()
88+
89+
sink(arg: ptr.pointee) // $ tainted=87
90+
sink(arg: ptr)
91+
}
92+
93+
func testMutatingMyPointerInCall(ptr: MyPointer) {
94+
sink(arg: ptr.pointee)
95+
sink(arg: ptr)
96+
97+
taintMyPointer(ptr: ptr) // mutates `ptr` pointee with a tainted value
98+
99+
sink(arg: ptr.pointee) // $ MISSING: tainted=87
100+
sink(arg: ptr)
101+
}

0 commit comments

Comments
 (0)