@@ -15,6 +15,11 @@ extension String {
15
15
}
16
16
}
17
17
18
+ class NSString {
19
+ func write( toFile: String , atomically: Bool , encoding: UInt ) { }
20
+ func write( to: URL , atomically: Bool , encoding: UInt ) { }
21
+ }
22
+
18
23
class Data {
19
24
struct WritingOptions : OptionSet { let rawValue : Int }
20
25
init < S> ( _ elements: S ) { }
@@ -29,6 +34,10 @@ class NSData {
29
34
func write( toFile: String , options: NSData . WritingOptions ) { }
30
35
}
31
36
37
+ class NSKeyedUnarchiver {
38
+ func unarchiveObject( withFile: String ) -> Any ? { return nil }
39
+ }
40
+
32
41
struct URLResourceKey { }
33
42
34
43
struct FileAttributeKey : Hashable { }
@@ -37,9 +46,10 @@ struct ObjCBool {}
37
46
38
47
struct AutoreleasingUnsafeMutablePointer < Pointee> { }
39
48
40
- struct FilePath {
49
+ struct FilePath : ExpressibleByStringLiteral {
50
+ typealias StringLiteralType = String
41
51
init ( stringLiteral: String ) { }
42
- func lexicallyNormalized( ) -> FilePath { return FilePath ( stringLiteral : " " ) }
52
+ func lexicallyNormalized( ) -> FilePath { return " " }
43
53
func starts( with: FilePath ) -> Bool { return false }
44
54
}
45
55
@@ -91,6 +101,38 @@ class FileManager {
91
101
func replaceItemAtURL( originalItemURL: NSURL , withItemAtURL: NSURL , backupItemName: String ? , options: FileManager . ItemReplacementOptions ) -> NSURL ? { return nil }
92
102
}
93
103
104
+ struct FileDescriptor {
105
+ struct AccessMode : RawRepresentable {
106
+ static let readOnly = AccessMode ( rawValue: 0 )
107
+ let rawValue : UInt8
108
+ init ( rawValue: UInt8 ) { self . rawValue = rawValue}
109
+ }
110
+
111
+ struct OpenOptions : RawRepresentable {
112
+ static let append = OpenOptions ( rawValue: 0 )
113
+ let rawValue : UInt8
114
+ init ( rawValue: UInt8 ) { self . rawValue = rawValue}
115
+ }
116
+ }
117
+
118
+ struct FilePermissions : RawRepresentable {
119
+ static let ownerRead = FilePermissions ( rawValue: 0 )
120
+ let rawValue : UInt8
121
+ init ( rawValue: UInt8 ) { self . rawValue = rawValue}
122
+ }
123
+
124
+ class ArchiveByteStream {
125
+ static func fileStream( fd: FileDescriptor , automaticClose: Bool = true ) -> ArchiveByteStream ? { return nil }
126
+ static func withFileStream< E> ( fd: FileDescriptor , automaticClose: Bool = true , _ body: ( ArchiveByteStream ) -> E ) -> E { return body ( ArchiveByteStream ( ) ) }
127
+ static func fileStream( path: FilePath , mode: FileDescriptor . AccessMode , options: FileDescriptor . OpenOptions , permissions: FilePermissions ) -> ArchiveByteStream ? { return nil }
128
+ static func withFileStream< E> ( path: FilePath , mode: FileDescriptor . AccessMode , options: FileDescriptor . OpenOptions , permissions: FilePermissions , _ body: ( ArchiveByteStream ) -> E ) -> E { return body ( ArchiveByteStream ( ) ) }
129
+ }
130
+
131
+ class Bundle {
132
+ init ? ( url: URL ) { }
133
+ init ? ( path: String ) { }
134
+ }
135
+
94
136
// GRDB
95
137
96
138
struct Configuration { }
@@ -124,81 +166,91 @@ func test() {
124
166
let safeUrl = URL ( string: " " ) !
125
167
let safeNsUrl = NSURL ( string: " " ) !
126
168
127
- Data ( " " ) . write ( to: remoteUrl, options: [ ] ) // $ hasPathInjection=121
169
+ Data ( " " ) . write ( to: remoteUrl, options: [ ] ) // $ hasPathInjection=163
128
170
129
171
let nsData = NSData ( )
130
- let _ = nsData. write ( to: remoteUrl, atomically: false ) // $ hasPathInjection=121
131
- nsData. write ( to: remoteUrl, options: [ ] ) // $ hasPathInjection=121
132
- let _ = nsData. write ( toFile: remoteString, atomically: false ) // $ hasPathInjection=121
133
- nsData. write ( toFile: remoteString, options: [ ] ) // $ hasPathInjection=121
172
+ let _ = nsData. write ( to: remoteUrl, atomically: false ) // $ hasPathInjection=163
173
+ nsData. write ( to: remoteUrl, options: [ ] ) // $ hasPathInjection=163
174
+ let _ = nsData. write ( toFile: remoteString, atomically: false ) // $ hasPathInjection=163
175
+ nsData. write ( toFile: remoteString, options: [ ] ) // $ hasPathInjection=163
134
176
135
177
let fm = FileManager ( )
136
- let _ = fm. contentsOfDirectory ( at: remoteUrl, includingPropertiesForKeys: [ ] , options: [ ] ) // $ hasPathInjection=121
137
- let _ = fm. contentsOfDirectory ( atPath: remoteString) // $ hasPathInjection=121
138
- let _ = fm. enumerator ( at: remoteUrl, includingPropertiesForKeys: [ ] , options: [ ] , errorHandler: nil ) // $ hasPathInjection=121
139
- let _ = fm. enumerator ( atPath: remoteString) // $ hasPathInjection=121
140
- let _ = fm. subpathsOfDirectory ( atPath: remoteString) // $ hasPathInjection=121
141
- let _ = fm. subpaths ( atPath: remoteString) // $ hasPathInjection=121
142
- fm. createDirectory ( at: remoteUrl, withIntermediateDirectories: false , attributes: [ : ] ) // $ hasPathInjection=121
143
- let _ = fm. createDirectory ( atPath: remoteString, attributes: [ : ] ) // $ hasPathInjection=121
144
- let _ = fm. createFile ( atPath: remoteString, contents: nil , attributes: [ : ] ) // $ hasPathInjection=121
145
- fm. removeItem ( at: remoteUrl) // $ hasPathInjection=121
146
- fm. removeItem ( atPath: remoteString) // $ hasPathInjection=121
147
- fm. trashItem ( at: remoteUrl, resultingItemURL: AutoreleasingUnsafeMutablePointer < NSURL ? > ( ) ) // $ hasPathInjection=121
148
- let _ = fm. replaceItemAt ( remoteUrl, withItemAt: safeUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=121
149
- let _ = fm. replaceItemAt ( safeUrl, withItemAt: remoteUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=121
150
- fm. replaceItem ( at: remoteUrl, withItemAt: safeUrl, backupItemName: nil , options: [ ] , resultingItemURL: AutoreleasingUnsafeMutablePointer < NSURL ? > ( ) ) // $ hasPathInjection=121
151
- fm. replaceItem ( at: safeUrl, withItemAt: remoteUrl, backupItemName: nil , options: [ ] , resultingItemURL: AutoreleasingUnsafeMutablePointer < NSURL ? > ( ) ) // $ hasPathInjection=121
152
- fm. copyItem ( at: remoteUrl, to: safeUrl) // $ hasPathInjection=121
153
- fm. copyItem ( at: safeUrl, to: remoteUrl) // $ hasPathInjection=121
154
- fm. copyItem ( atPath: remoteString, toPath: " " ) // $ hasPathInjection=121
155
- fm. copyItem ( atPath: " " , toPath: remoteString) // $ hasPathInjection=121
156
- fm. moveItem ( at: remoteUrl, to: safeUrl) // $ hasPathInjection=121
157
- fm. moveItem ( at: safeUrl, to: remoteUrl) // $ hasPathInjection=121
158
- fm. moveItem ( atPath: remoteString, toPath: " " ) // $ hasPathInjection=121
159
- fm. moveItem ( atPath: " " , toPath: remoteString) // $ hasPathInjection=121
160
- fm. createSymbolicLink ( at: remoteUrl, withDestinationURL: safeUrl) // $ hasPathInjection=121
161
- fm. createSymbolicLink ( at: safeUrl, withDestinationURL: remoteUrl) // $ hasPathInjection=121
162
- fm. createSymbolicLink ( atPath: remoteString, withDestinationPath: " " ) // $ hasPathInjection=121
163
- fm. createSymbolicLink ( atPath: " " , withDestinationPath: remoteString) // $ hasPathInjection=121
164
- fm. linkItem ( at: remoteUrl, to: safeUrl) // $ hasPathInjection=121
165
- fm. linkItem ( at: safeUrl, to: remoteUrl) // $ hasPathInjection=121
166
- fm. linkItem ( atPath: remoteString, toPath: " " ) // $ hasPathInjection=121
167
- fm. linkItem ( atPath: " " , toPath: remoteString) // $ hasPathInjection=121
168
- let _ = fm. destinationOfSymbolicLink ( atPath: remoteString) // $ hasPathInjection=121
169
- let _ = fm. fileExists ( atPath: remoteString) // $ hasPathInjection=121
170
- let _ = fm. fileExists ( atPath: remoteString, isDirectory: UnsafeMutablePointer< ObjCBool> . init( bitPattern: 0 ) ) // $ hasPathInjection=121
171
- fm. setAttributes ( [ : ] , ofItemAtPath: remoteString) // $ hasPathInjection=121
172
- let _ = fm. contents ( atPath: remoteString) // $ hasPathInjection=121
173
- let _ = fm. contentsEqual ( atPath: remoteString, andPath: " " ) // $ hasPathInjection=121
174
- let _ = fm. contentsEqual ( atPath: " " , andPath: remoteString) // $ hasPathInjection=121
175
- let _ = fm. changeCurrentDirectoryPath ( remoteString) // $ hasPathInjection=121
176
- let _ = fm. unmountVolume ( at: remoteUrl, options: [ ] , completionHandler: { _ in } ) // $ hasPathInjection=121
178
+ let _ = fm. contentsOfDirectory ( at: remoteUrl, includingPropertiesForKeys: [ ] , options: [ ] ) // $ hasPathInjection=163
179
+ let _ = fm. contentsOfDirectory ( atPath: remoteString) // $ hasPathInjection=163
180
+ let _ = fm. enumerator ( at: remoteUrl, includingPropertiesForKeys: [ ] , options: [ ] , errorHandler: nil ) // $ hasPathInjection=163
181
+ let _ = fm. enumerator ( atPath: remoteString) // $ hasPathInjection=163
182
+ let _ = fm. subpathsOfDirectory ( atPath: remoteString) // $ hasPathInjection=163
183
+ let _ = fm. subpaths ( atPath: remoteString) // $ hasPathInjection=163
184
+ fm. createDirectory ( at: remoteUrl, withIntermediateDirectories: false , attributes: [ : ] ) // $ hasPathInjection=163
185
+ let _ = fm. createDirectory ( atPath: remoteString, attributes: [ : ] ) // $ hasPathInjection=163
186
+ let _ = fm. createFile ( atPath: remoteString, contents: nil , attributes: [ : ] ) // $ hasPathInjection=163
187
+ fm. removeItem ( at: remoteUrl) // $ hasPathInjection=163
188
+ fm. removeItem ( atPath: remoteString) // $ hasPathInjection=163
189
+ fm. trashItem ( at: remoteUrl, resultingItemURL: AutoreleasingUnsafeMutablePointer < NSURL ? > ( ) ) // $ hasPathInjection=163
190
+ let _ = fm. replaceItemAt ( remoteUrl, withItemAt: safeUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=163
191
+ let _ = fm. replaceItemAt ( safeUrl, withItemAt: remoteUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=163
192
+ fm. replaceItem ( at: remoteUrl, withItemAt: safeUrl, backupItemName: nil , options: [ ] , resultingItemURL: AutoreleasingUnsafeMutablePointer < NSURL ? > ( ) ) // $ hasPathInjection=163
193
+ fm. replaceItem ( at: safeUrl, withItemAt: remoteUrl, backupItemName: nil , options: [ ] , resultingItemURL: AutoreleasingUnsafeMutablePointer < NSURL ? > ( ) ) // $ hasPathInjection=163
194
+ fm. copyItem ( at: remoteUrl, to: safeUrl) // $ hasPathInjection=163
195
+ fm. copyItem ( at: safeUrl, to: remoteUrl) // $ hasPathInjection=163
196
+ fm. copyItem ( atPath: remoteString, toPath: " " ) // $ hasPathInjection=163
197
+ fm. copyItem ( atPath: " " , toPath: remoteString) // $ hasPathInjection=163
198
+ fm. moveItem ( at: remoteUrl, to: safeUrl) // $ hasPathInjection=163
199
+ fm. moveItem ( at: safeUrl, to: remoteUrl) // $ hasPathInjection=163
200
+ fm. moveItem ( atPath: remoteString, toPath: " " ) // $ hasPathInjection=163
201
+ fm. moveItem ( atPath: " " , toPath: remoteString) // $ hasPathInjection=163
202
+ fm. createSymbolicLink ( at: remoteUrl, withDestinationURL: safeUrl) // $ hasPathInjection=163
203
+ fm. createSymbolicLink ( at: safeUrl, withDestinationURL: remoteUrl) // $ hasPathInjection=163
204
+ fm. createSymbolicLink ( atPath: remoteString, withDestinationPath: " " ) // $ hasPathInjection=163
205
+ fm. createSymbolicLink ( atPath: " " , withDestinationPath: remoteString) // $ hasPathInjection=163
206
+ fm. linkItem ( at: remoteUrl, to: safeUrl) // $ hasPathInjection=163
207
+ fm. linkItem ( at: safeUrl, to: remoteUrl) // $ hasPathInjection=163
208
+ fm. linkItem ( atPath: remoteString, toPath: " " ) // $ hasPathInjection=163
209
+ fm. linkItem ( atPath: " " , toPath: remoteString) // $ hasPathInjection=163
210
+ let _ = fm. destinationOfSymbolicLink ( atPath: remoteString) // $ hasPathInjection=163
211
+ let _ = fm. fileExists ( atPath: remoteString) // $ hasPathInjection=163
212
+ let _ = fm. fileExists ( atPath: remoteString, isDirectory: UnsafeMutablePointer< ObjCBool> . init( bitPattern: 0 ) ) // $ hasPathInjection=163
213
+ fm. setAttributes ( [ : ] , ofItemAtPath: remoteString) // $ hasPathInjection=163
214
+ let _ = fm. contents ( atPath: remoteString) // $ hasPathInjection=163
215
+ let _ = fm. contentsEqual ( atPath: remoteString, andPath: " " ) // $ hasPathInjection=163
216
+ let _ = fm. contentsEqual ( atPath: " " , andPath: remoteString) // $ hasPathInjection=163
217
+ let _ = fm. changeCurrentDirectoryPath ( remoteString) // $ hasPathInjection=163
218
+ let _ = fm. unmountVolume ( at: remoteUrl, options: [ ] , completionHandler: { _ in } ) // $ hasPathInjection=163
177
219
// Deprecated methods
178
- let _ = fm. changeFileAttributes ( [ : ] , atPath: remoteString) // $ hasPathInjection=121
179
- let _ = fm. directoryContents ( atPath: remoteString) // $ hasPathInjection=121
180
- let _ = fm. createDirectory ( atPath: remoteString, attributes: [ : ] ) // $ hasPathInjection=121
181
- let _ = fm. createSymbolicLink ( atPath: remoteString, pathContent: " " ) // $ hasPathInjection=121
182
- let _ = fm. createSymbolicLink ( atPath: " " , pathContent: remoteString) // $ hasPathInjection=121
183
- let _ = fm. pathContentOfSymbolicLink ( atPath: remoteString) // $ hasPathInjection=121
184
- let _ = fm. replaceItemAtURL ( originalItemURL: remoteNsUrl, withItemAtURL: safeNsUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=121
185
- let _ = fm. replaceItemAtURL ( originalItemURL: safeNsUrl, withItemAtURL: remoteNsUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=121
186
-
187
- let _ = Database ( path: remoteString, description: " " , configuration: Configuration ( ) ) // $ hasPathInjection=121
220
+ let _ = fm. changeFileAttributes ( [ : ] , atPath: remoteString) // $ hasPathInjection=163
221
+ let _ = fm. directoryContents ( atPath: remoteString) // $ hasPathInjection=163
222
+ let _ = fm. createDirectory ( atPath: remoteString, attributes: [ : ] ) // $ hasPathInjection=163
223
+ let _ = fm. createSymbolicLink ( atPath: remoteString, pathContent: " " ) // $ hasPathInjection=163
224
+ let _ = fm. createSymbolicLink ( atPath: " " , pathContent: remoteString) // $ hasPathInjection=163
225
+ let _ = fm. pathContentOfSymbolicLink ( atPath: remoteString) // $ hasPathInjection=163
226
+ let _ = fm. replaceItemAtURL ( originalItemURL: remoteNsUrl, withItemAtURL: safeNsUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=163
227
+ let _ = fm. replaceItemAtURL ( originalItemURL: safeNsUrl, withItemAtURL: remoteNsUrl, backupItemName: nil , options: [ ] ) // $ hasPathInjection=163
228
+
229
+ NSString ( ) . write ( to: remoteUrl, atomically: true , encoding: 0 ) // $ hasPathInjection=163
230
+ NSString ( ) . write ( toFile: remoteString, atomically: true , encoding: 0 ) // $ hasPathInjection=163
231
+ let _ = NSKeyedUnarchiver ( ) . unarchiveObject ( withFile: remoteString) // $ hasPathInjection=163
232
+ let _ = ArchiveByteStream . fileStream ( fd: remoteString as! FileDescriptor , automaticClose: true ) // $ hasPathInjection=163
233
+ ArchiveByteStream . withFileStream ( fd: remoteString as! FileDescriptor , automaticClose: true ) { _ in } // $ hasPathInjection=163
234
+ let _ = ArchiveByteStream . fileStream ( path: FilePath ( stringLiteral: remoteString) , mode: . readOnly, options: . append, permissions: . ownerRead) // $ hasPathInjection=163
235
+ ArchiveByteStream . withFileStream ( path: FilePath ( stringLiteral: remoteString) , mode: . readOnly, options: . append, permissions: . ownerRead) { _ in } // $ hasPathInjection=163
236
+ let _ = Bundle ( url: remoteUrl) // $ hasPathInjection=163
237
+ let _ = Bundle ( path: remoteString) // $ hasPathInjection=163
238
+
239
+ let _ = Database ( path: remoteString, description: " " , configuration: Configuration ( ) ) // $ hasPathInjection=163
188
240
let _ = Database ( path: " " , description: " " , configuration: Configuration ( ) ) // Safe
189
- let _ = DatabasePool ( path: remoteString, configuration: Configuration ( ) ) // $ hasPathInjection=121
241
+ let _ = DatabasePool ( path: remoteString, configuration: Configuration ( ) ) // $ hasPathInjection=163
190
242
let _ = DatabasePool ( path: " " , configuration: Configuration ( ) ) // Safe
191
- let _ = DatabaseQueue ( path: remoteString, configuration: Configuration ( ) ) // $ hasPathInjection=121
243
+ let _ = DatabaseQueue ( path: remoteString, configuration: Configuration ( ) ) // $ hasPathInjection=163
192
244
let _ = DatabaseQueue ( path: " " , configuration: Configuration ( ) ) // Safe
193
- let _ = DatabaseSnapshotPool ( path: remoteString, configuration: Configuration ( ) ) // $ hasPathInjection=121
245
+ let _ = DatabaseSnapshotPool ( path: remoteString, configuration: Configuration ( ) ) // $ hasPathInjection=163
194
246
let _ = DatabaseSnapshotPool ( path: " " , configuration: Configuration ( ) ) // Safe
195
- let _ = SerializedDatabase ( path: remoteString, defaultLabel: " " ) // $ hasPathInjection=121
247
+ let _ = SerializedDatabase ( path: remoteString, defaultLabel: " " ) // $ hasPathInjection=163
196
248
let _ = SerializedDatabase ( path: " " , defaultLabel: " " ) // Safe
197
- let _ = SerializedDatabase ( path: remoteString, defaultLabel: " " , purpose: nil ) // $ hasPathInjection=121
249
+ let _ = SerializedDatabase ( path: remoteString, defaultLabel: " " , purpose: nil ) // $ hasPathInjection=163
198
250
let _ = SerializedDatabase ( path: " " , defaultLabel: " " , purpose: nil ) // Safe
199
- let _ = SerializedDatabase ( path: remoteString, configuration: Configuration ( ) , defaultLabel: " " ) // $ hasPathInjection=121
251
+ let _ = SerializedDatabase ( path: remoteString, configuration: Configuration ( ) , defaultLabel: " " ) // $ hasPathInjection=163
200
252
let _ = SerializedDatabase ( path: " " , configuration: Configuration ( ) , defaultLabel: " " ) // Safe
201
- let _ = SerializedDatabase ( path: remoteString, configuration: Configuration ( ) , defaultLabel: " " , purpose: nil ) // $ hasPathInjection=121
253
+ let _ = SerializedDatabase ( path: remoteString, configuration: Configuration ( ) , defaultLabel: " " , purpose: nil ) // $ hasPathInjection=163
202
254
let _ = SerializedDatabase ( path: " " , configuration: Configuration ( ) , defaultLabel: " " , purpose: nil ) // Safe
203
255
}
204
256
@@ -208,8 +260,8 @@ func testSanitizers() {
208
260
let fm = FileManager ( )
209
261
210
262
let filePath = FilePath ( stringLiteral: remoteString)
211
- if ( filePath. lexicallyNormalized ( ) . starts ( with: FilePath ( stringLiteral : " /safe " ) ) ) {
212
- fm. contents ( atPath: remoteString) // Safe
263
+ if ( filePath. lexicallyNormalized ( ) . starts ( with: " /safe " ) ) {
264
+ let _ = fm. contents ( atPath: remoteString) // Safe
213
265
}
214
- fm. contents ( atPath: remoteString) // $ hasPathInjection=206
266
+ let _ = fm. contents ( atPath: remoteString) // $ hasPathInjection=258
215
267
}
0 commit comments