Skip to content
Snippets Groups Projects
Commit 135e1f5d authored by George Nachman's avatar George Nachman
Browse files

Avoid filesystem access to network mounts by semantic history....

Avoid filesystem access to network mounts by semantic history. fileURLWithPath: and standardizedURL would both perform I/O. Issue 5740.
parent 2a527d57
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -39,6 +39,9 @@
- (BOOL)fileExistsAtPathLocally:(NSString *)filename
additionalNetworkPaths:(NSArray<NSString *> *)additionalNetworkpaths;
 
- (BOOL)fileHasForbiddenPrefix:(NSString *)filename
additionalNetworkPaths:(NSArray<NSString *> *)additionalNetworkpaths;
// Returns the path to the user's desktop.
- (NSString *)desktopDirectory;
 
Loading
Loading
Loading
Loading
@@ -196,8 +196,8 @@ NSString * const DirectoryLocationDomain = @"DirectoryLocationDomain";
return YES;
}
 
- (BOOL)fileExistsAtPathLocally:(NSString *)filename
additionalNetworkPaths:(NSArray<NSString *> *)additionalNetworkPaths {
- (BOOL)fileHasForbiddenPrefix:(NSString *)filename
additionalNetworkPaths:(NSArray<NSString *> *)additionalNetworkPaths {
DLog(@"Additional network paths are: %@", additionalNetworkPaths);
// Augment list of additional paths with nfs automounter mount points.
NSMutableArray *networkPaths = [[additionalNetworkPaths mutableCopy] autorelease];
Loading
Loading
@@ -213,10 +213,17 @@ NSString * const DirectoryLocationDomain = @"DirectoryLocationDomain";
}
if ([filename hasPrefix:path]) {
DLog(@"Filename %@ has prefix of ignored path %@", filename, path);
return NO;
return YES;
}
}
return NO;
}
 
- (BOOL)fileExistsAtPathLocally:(NSString *)filename
additionalNetworkPaths:(NSArray<NSString *> *)additionalNetworkPaths {
if ([self fileHasForbiddenPrefix:filename additionalNetworkPaths:additionalNetworkPaths]) {
return NO;
}
struct statfs buf;
int rc = statfs([filename UTF8String], &buf);
if (rc != 0 || (buf.f_flags & MNT_LOCAL)) {
Loading
Loading
Loading
Loading
@@ -48,6 +48,11 @@ NSString *const kSemanticHistoryWorkingDirectorySubstitutionKey = @"semanticHist
additionalNetworkPaths:[[iTermAdvancedSettingsModel pathsToIgnore] componentsSeparatedByString:@","]];
}
 
- (BOOL)fileHasForbiddenPrefix:(NSString *)path {
return [self.fileManager fileHasForbiddenPrefix:path
additionalNetworkPaths:[[iTermAdvancedSettingsModel pathsToIgnore] componentsSeparatedByString:@","]];
}
- (NSString *)getFullPath:(NSString *)path
workingDirectory:(NSString *)workingDirectory
lineNumber:(NSString **)lineNumber
Loading
Loading
@@ -87,14 +92,30 @@ NSString *const kSemanticHistoryWorkingDirectorySubstitutionKey = @"semanticHist
DLog(@" Prepend working directory, giving %@", path);
}
 
NSURL *url = [NSURL fileURLWithPath:path];
DLog(@" Checking if file exists locally: %@", path);
 
// Resolve path by removing ./ and ../ etc
path = [[url standardizedURL] path];
DLog(@" Standardized path is %@", path);
// NOTE: The path used to be standardized first. While that would allow us to catch
// network paths, it also caused filesystem access that would hit network paths.
// That was also true for fileURLWithPath:.
//
// I think the statfs() flag check ought to be enough to prevent network access, anyway.
// A second check for forbidden prefixes is performed below to ensure backward compatibility
// and respect for explicitly excluded paths. The latter category will now
// be stat()ed, although they were always stat()ed because of unintentional
// disk access in the old code.
 
if ([self fileExistsAtPathLocally:path]) {
DLog(@" YES: A file exists at %@", path);
NSURL *url = [NSURL fileURLWithPath:path];
// Resolve path by removing ./ and ../ etc
path = [[url standardizedURL] path];
DLog(@" Check standardized path for forbidden prefix %@", path);
if ([self fileHasForbiddenPrefix:path]) {
DLog(@" NO: Standardized path has forbidden prefix.");
return nil;
}
return path;
}
 
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment