@@ -7,7 +7,19 @@ protocol SortComparator {
7
7
associatedtype Compared
8
8
}
9
9
10
- struct Data : RangeReplaceableCollection
10
+ protocol DataProtocol {
11
+ }
12
+ extension DataProtocol {
13
+ func copyBytes( to: UnsafeMutableRawBufferPointer ) { }
14
+ func copyBytes( to: UnsafeMutablePointer < UInt8 > , count: Int ) { }
15
+ func copyBytes( to: UnsafeMutablePointer < UInt8 > , from: Range < Data . Index > ) { }
16
+ }
17
+ extension UnsafeRawBufferPointer : DataProtocol { }
18
+ extension Array : DataProtocol where Element == UInt8 { }
19
+
20
+ protocol MutableDataProtocol : DataProtocol , RangeReplaceableCollection { }
21
+
22
+ struct Data : MutableDataProtocol
11
23
{
12
24
struct Base64EncodingOptions : OptionSet { let rawValue : Int }
13
25
struct Base64DecodingOptions : OptionSet { let rawValue : Int }
@@ -82,182 +94,193 @@ func taintThroughData() {
82
94
let dataTainted2 = Data ( dataTainted)
83
95
84
96
sink ( arg: dataClean)
85
- sink ( arg: dataTainted) // $ tainted=81
86
- sink ( arg: dataTainted2) // $ tainted=81
97
+ sink ( arg: dataTainted) // $ tainted=93
98
+ sink ( arg: dataTainted2) // $ tainted=93
87
99
88
100
// ";Data;true;init(base64Encoded:options:);;;Argument[0];ReturnValue;taint",
89
101
let dataTainted3 = Data ( base64Encoded: source ( ) as! Data , options: [ ] )
90
- sink ( arg: dataTainted3) // $ tainted=89
102
+ sink ( arg: dataTainted3) // $ tainted=101
91
103
92
104
// ";Data;true;init(buffer:);;;Argument[0];ReturnValue;taint",
93
105
let dataTainted4 = Data ( buffer: source ( ) as! UnsafeBufferPointer < UInt8 > )
94
- sink ( arg: dataTainted4) // $ tainted=93
106
+ sink ( arg: dataTainted4) // $ tainted=105
95
107
let dataTainted5 = Data ( buffer: source ( ) as! UnsafeMutablePointer < UInt8 > )
96
- sink ( arg: dataTainted5) // $ tainted=95
108
+ sink ( arg: dataTainted5) // $ tainted=107
97
109
98
110
// ";Data;true;init(bytes:count:);;;Argument[0];ReturnValue;taint",
99
111
let dataTainted6 = Data ( bytes: source ( ) as! UnsafeRawPointer , count: 0 )
100
- sink ( arg: dataTainted6) // $ tainted=99
112
+ sink ( arg: dataTainted6) // $ tainted=111
101
113
102
114
// ";Data;true;init(bytesNoCopy:count:deallocator:);;;Argument[0];ReturnValue;taint",
103
115
let dataTainted7 = Data ( bytesNoCopy: source ( ) as! UnsafeRawPointer , count: 0 , deallocator: Data . Deallocator. none)
104
- sink ( arg: dataTainted7) // $ tainted=103
116
+ sink ( arg: dataTainted7) // $ tainted=115
105
117
106
118
// ";Data;true;init(contentsOf:options:);;;Argument[0];ReturnValue;taint",
107
119
let urlTainted8 = source ( ) as! URL
108
120
let dataTainted8 = Data ( contentsOf: urlTainted8, options: [ ] )
109
- sink ( arg: dataTainted8) // $ tainted=107
121
+ sink ( arg: dataTainted8) // $ tainted=119
110
122
111
123
// ";Data;true;init(referencing:);;;Argument[0];ReturnValue;taint",
112
124
let dataTainted9 = Data ( referencing: source ( ) as! NSData )
113
- sink ( arg: dataTainted9) // $ tainted=112
125
+ sink ( arg: dataTainted9) // $ tainted=124
114
126
115
127
// ";Data;true;append(_:);;;Argument[0];Argument[-1];taint",
116
128
let dataTainted10 = Data ( " " )
117
129
dataTainted10. append ( source ( ) as! Data )
118
- sink ( arg: dataTainted10) // $ tainted=117
130
+ sink ( arg: dataTainted10) // $ tainted=129
119
131
120
132
let dataTainted11 = Data ( " " )
121
133
dataTainted11. append ( source ( ) as! UInt8 )
122
- sink ( arg: dataTainted11) // $ tainted=121
134
+ sink ( arg: dataTainted11) // $ tainted=133
123
135
124
136
let dataTainted12 = Data ( " " )
125
137
dataTainted12. append ( source ( ) as! UnsafeBufferPointer < UInt8 > )
126
- sink ( arg: dataTainted12) // $ tainted=125
138
+ sink ( arg: dataTainted12) // $ tainted=137
127
139
128
140
// ";Data;true;append(_:count:);;;Argument[0];Argument[-1];taint",
129
141
let dataTainted13 = Data ( " " )
130
142
dataTainted13. append ( source ( ) as! UnsafePointer < UInt8 > , count: 0 )
131
- sink ( arg: dataTainted13) // $ tainted=130
143
+ sink ( arg: dataTainted13) // $ tainted=142
132
144
133
145
// ";Data;true;append(contentsOf:);;;Argument[0];Argument[-1];taint",
134
146
let dataTainted14 = Data ( " " )
135
147
dataTainted14. append ( contentsOf: source ( ) as! [ UInt8 ] )
136
- sink ( arg: dataTainted14) // $ tainted=135
148
+ sink ( arg: dataTainted14) // $ tainted=147
137
149
138
150
// ";Data;true;base64EncodedData(options:);;;Argument[-1];ReturnValue;taint",
139
151
let dataTainted15 = source ( ) as! Data
140
- sink ( arg: dataTainted15. base64EncodedData ( options: [ ] ) ) // $ tainted=139
152
+ sink ( arg: dataTainted15. base64EncodedData ( options: [ ] ) ) // $ tainted=151
141
153
142
154
// ";Data;true;base64EncodedString(options:);;;Argument[-1];ReturnValue;taint",
143
155
let dataTainted16 = source ( ) as! Data
144
- sink ( arg: dataTainted16. base64EncodedString ( options: [ ] ) ) // $ tainted=143
156
+ sink ( arg: dataTainted16. base64EncodedString ( options: [ ] ) ) // $ tainted=155
145
157
146
158
// ";Data;true;compactMap(_:);;;Argument[-1];ReturnValue;taint",
147
159
let dataTainted17 = source ( ) as! Data
148
160
let compactMapped : [ Int ] = dataTainted17. compactMap { str in Int ( str) }
149
- sink ( arg: compactMapped) // $ tainted=147
161
+ sink ( arg: compactMapped) // $ tainted=159
150
162
151
163
// ";Data;true;copyBytes(to:);;;Argument[-1];Argument[0];taint",
152
164
let dataTainted18 = source ( ) as! Data
153
165
let pointerTainted18 = UnsafeMutableRawBufferPointer . allocate ( byteCount: 0 , alignment: 0 )
154
166
dataTainted18. copyBytes ( to: pointerTainted18)
155
- sink ( arg: pointerTainted18) // $ tainted=152
167
+ sink ( arg: pointerTainted18) // $ tainted=164
156
168
157
169
// ";Data;true;copyBytes(to:count:);;;Argument[-1];Argument[0];taint",
158
170
let dataTainted19 = source ( ) as! Data
159
171
let pointerTainted19 = UnsafeMutablePointer< UInt8> . allocate( capacity: 0 )
160
172
dataTainted19. copyBytes ( to: pointerTainted19, count: 0 )
161
- sink ( arg: pointerTainted19) // $ tainted=158
173
+ sink ( arg: pointerTainted19) // $ tainted=170
162
174
163
175
// ";Data;true;copyBytes(to:from:);;;Argument[-1];Argument[0];taint",
164
176
let dataTainted20 = source ( ) as! Data
165
177
let pointerTainted20 = UnsafeMutablePointer< UInt8> . allocate( capacity: 0 )
166
178
dataTainted20. copyBytes ( to: pointerTainted20, from: 0 ..< 1 )
167
- sink ( arg: pointerTainted20) // $ tainted=164
179
+ sink ( arg: pointerTainted20) // $ tainted=176
168
180
169
181
// ";Data;true;flatMap(_:);;;Argument[-1];ReturnValue;taint",
170
182
let dataTainted21 = source ( ) as! Data
171
183
let flatMapped = dataTainted21. flatMap { Array ( repeating: $0, count: 0 ) }
172
- sink ( arg: flatMapped) // $ tainted=170
184
+ sink ( arg: flatMapped) // $ tainted=182
173
185
174
186
let dataTainted22 = source ( ) as! Data
175
187
let flatMapped2 = dataTainted22. flatMap { str in Int ( str) }
176
- sink ( arg: flatMapped2) // $ tainted=174
188
+ sink ( arg: flatMapped2) // $ tainted=186
177
189
178
190
// ";Data;true;insert(_:at:);;;Argument[0];Argument[-1];taint",
179
191
let dataTainted23 = Data ( " " )
180
192
dataTainted23. insert ( source ( ) as! UInt8 , at: 0 )
181
- sink ( arg: dataTainted23) // $ tainted=180
193
+ sink ( arg: dataTainted23) // $ tainted=192
182
194
183
195
// ";Data;true;insert(contentsOf:at:);;;Argument[0];Argument[-1];taint",
184
196
let dataTainted24 = Data ( " " )
185
197
dataTainted24. insert ( contentsOf: source ( ) as! [ UInt8 ] , at: 0 )
186
- sink ( arg: dataTainted24) // $ tainted=185
198
+ sink ( arg: dataTainted24) // $ tainted=197
187
199
188
200
// ";Data;true;map(_:);;;Argument[-1];ReturnValue;taint",
189
201
let dataTainted25 = source ( ) as! Data
190
202
let mapped = dataTainted25. map { $0 }
191
- sink ( arg: mapped) // $ tainted=189
203
+ sink ( arg: mapped) // $ tainted=201
192
204
193
205
// ";Data;true;reduce(into:_:);;;Argument[-1];ReturnValue;taint",
194
206
let dataTainted26 = source ( ) as! Data
195
207
let reduced = dataTainted26. reduce ( into: [ : ] ) { c, i in c [ i, default: 0 ] += 1 }
196
- sink ( arg: reduced) // $ tainted=194
208
+ sink ( arg: reduced) // $ tainted=206
197
209
198
210
// ";Data;true;replace(_:with:maxReplacements:);;;Argument[1];Argument[-1];taint",
199
211
let dataTainted27 = Data ( " " )
200
212
dataTainted27. replace ( [ 0 ] , with: source ( ) as! [ UInt8 ] , maxReplacements: . max)
201
- sink ( arg: dataTainted27) // $ tainted=200
213
+ sink ( arg: dataTainted27) // $ tainted=212
202
214
203
215
// ";Data;true;replaceSubrange(_:with:);;;Argument[1];Argument[-1];taint",
204
216
let dataTainted28 = Data ( " " )
205
217
dataTainted28. replaceSubrange ( 1 ..< 3 , with: source ( ) as! Data )
206
- sink ( arg: dataTainted28) // $ tainted=205
218
+ sink ( arg: dataTainted28) // $ tainted=217
207
219
208
220
let dataTainted29 = Data ( " " )
209
221
dataTainted29. replaceSubrange ( 1 ..< 3 , with: source ( ) as! [ UInt8 ] )
210
- sink ( arg: dataTainted29) // $ tainted=209
222
+ sink ( arg: dataTainted29) // $ tainted=221
211
223
212
224
let dataTainted30 = Data ( " " )
213
225
dataTainted30. replaceSubrange ( 1 ..< 3 , with: source ( ) as! UnsafeBufferPointer < UInt8 > )
214
- sink ( arg: dataTainted30) // $ tainted=213
226
+ sink ( arg: dataTainted30) // $ tainted=225
215
227
216
228
// ";Data;true;replaceSubrange(_:with:count:);;;Argument[1];Argument[-1];taint",
217
229
let dataTainted31 = Data ( " " )
218
230
dataTainted31. replaceSubrange ( 1 ..< 3 , with: source ( ) as! UnsafeRawPointer , count: 0 )
219
- sink ( arg: dataTainted31) // $ tainted=218
231
+ sink ( arg: dataTainted31) // $ tainted=230
220
232
221
233
// ";Data;true;replacing(_:with:maxReplacements:);;;Argument[1];Argument[-1];taint",
222
234
let dataTainted32 = Data ( " " )
223
235
let _ = dataTainted32. replacing ( [ 0 ] , with: source ( ) as! [ UInt8 ] , maxReplacements: 0 )
224
- sink ( arg: dataTainted32) // $ tainted=223
236
+ sink ( arg: dataTainted32) // $ tainted=235
225
237
226
238
// ";Data;true;replacing(_:with:subrange:maxReplacements:);;;Argument[1];Argument[-1];taint",
227
239
let dataTainted33 = Data ( " " )
228
240
let _ = dataTainted33. replacing ( [ 0 ] , with: source ( ) as! [ UInt8 ] , subrange: 1 ..< 3 , maxReplacements: 0 )
229
- sink ( arg: dataTainted33) // $ tainted=228
241
+ sink ( arg: dataTainted33) // $ tainted=240
230
242
231
243
// ";Data;true;reversed();;;Argument[-1];ReturnValue;taint",
232
244
let dataTainted34 = source ( ) as! Data
233
- sink ( arg: dataTainted34. reversed ( ) ) // $ tainted=232
245
+ sink ( arg: dataTainted34. reversed ( ) ) // $ tainted=244
234
246
235
247
// ";Data;true;sorted();;;Argument[-1];ReturnValue;taint",
236
248
let dataTainted35 = source ( ) as! Data
237
- sink ( arg: dataTainted35. sorted ( ) ) // $ tainted=236
249
+ sink ( arg: dataTainted35. sorted ( ) ) // $ tainted=248
238
250
239
251
// ";Data;true;sorted(by:);;;Argument[-1];ReturnValue;taint",
240
252
let dataTainted36 = source ( ) as! Data
241
- sink ( arg: dataTainted36. sorted { _, _ in return false } ) // $ tainted=240
253
+ sink ( arg: dataTainted36. sorted { _, _ in return false } ) // $ tainted=252
242
254
243
255
// ";Data;true;sorted(using:);;;Argument[-1];ReturnValue;taint",
244
256
let dataTainted37 = source ( ) as! Data
245
- sink ( arg: dataTainted37. sorted ( using: cmp ( ) !) ) // $ tainted=244
257
+ sink ( arg: dataTainted37. sorted ( using: cmp ( ) !) ) // $ tainted=256
246
258
247
259
// ";Data;true;shuffled();;;Argument[-1];ReturnValue;taint",
248
260
let dataTainted38 = source ( ) as! Data
249
- sink ( arg: dataTainted38. shuffled ( ) ) // $ tainted=248
261
+ sink ( arg: dataTainted38. shuffled ( ) ) // $ tainted=260
250
262
251
263
// ";Data;true;shuffled(using:);;;Argument[-1];ReturnValue;taint",
252
264
let dataTainted39 = source ( ) as! Data
253
- var rng = rng ( ) !
254
- sink ( arg: dataTainted39. shuffled ( using: & rng ) ) // $ tainted=252
265
+ var myRng = rng ( ) !
266
+ sink ( arg: dataTainted39. shuffled ( using: & myRng ) ) // $ tainted=264
255
267
256
268
// ";Data;true;trimmingPrefix(_:);;;Argument[-1];ReturnValue;taint",
257
269
let dataTainted40 = source ( ) as! Data
258
- sink ( arg: dataTainted40. trimmingPrefix ( [ 0 ] ) ) // $ tainted=257
270
+ sink ( arg: dataTainted40. trimmingPrefix ( [ 0 ] ) ) // $ tainted=269
259
271
260
272
// ";Data;true;trimmingPrefix(while:);;;Argument[-1];ReturnValue;taint"
261
273
let dataTainted41 = source ( ) as! Data
262
- sink ( arg: dataTainted41. trimmingPrefix { _ in false } ) // $ tainted=261
274
+ sink ( arg: dataTainted41. trimmingPrefix { _ in false } ) // $ tainted=273
275
+
276
+ // ";DataProtocol;true;copyBytes(to:);;;Argument[-1];Argument[0];taint",
277
+ let dataTainted43 = source ( ) as! UnsafeRawBufferPointer
278
+ let pointerTainted43 = UnsafeMutableRawBufferPointer . allocate ( byteCount: 0 , alignment: 0 )
279
+ dataTainted43. copyBytes ( to: pointerTainted43)
280
+ sink ( arg: pointerTainted43) // $ tainted=277
281
+
282
+ let dataTainted44 = source ( ) as! Array < UInt8 >
283
+ let pointerTainted44 = UnsafeMutableRawBufferPointer . allocate ( byteCount: 0 , alignment: 0 )
284
+ dataTainted44. copyBytes ( to: pointerTainted44)
285
+ sink ( arg: pointerTainted44) // $ tainted=282
263
286
}
0 commit comments