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