aboutsummaryrefslogtreecommitdiffstats
path: root/Source
diff options
context:
space:
mode:
authorrowanbeentje <rowan@beent.je>2009-06-05 01:28:18 +0000
committerrowanbeentje <rowan@beent.je>2009-06-05 01:28:18 +0000
commit47148e0493710c989384ca172ba47c7433092c36 (patch)
treedab0febb9c15911ca4146d7a6abc7c7322bff2c7 /Source
parent4e6c8e557f6dd132e159ff4841900d1b72331eea (diff)
downloadsequelpro-47148e0493710c989384ca172ba47c7433092c36.tar.gz
sequelpro-47148e0493710c989384ca172ba47c7433092c36.tar.bz2
sequelpro-47148e0493710c989384ca172ba47c7433092c36.zip
- Make memory management for SSH tunnels explicit to improve thread interaction and reduce crashes
- Add Command-. shortcuts for cancel buttons on SSH dialogs
Diffstat (limited to 'Source')
-rw-r--r--Source/SPSSHTunnel.m28
1 files changed, 21 insertions, 7 deletions
diff --git a/Source/SPSSHTunnel.m b/Source/SPSSHTunnel.m
index 79ea780c..d8332c14 100644
--- a/Source/SPSSHTunnel.m
+++ b/Source/SPSSHTunnel.m
@@ -35,13 +35,13 @@
*/
- (id) initToHost:(NSString *) theHost port:(int) thePort login:(NSString *) theLogin tunnellingToPort:(int) targetPort onHost:(NSString *) targetHost
{
- if (!theHost || !thePort || !theLogin || !targetPort || !targetHost) return nil;
+ if (!theHost || !thePort || !targetPort || !targetHost) return nil;
self = [super init];
// Store the connection settings as appropriate
sshHost = [[NSString alloc] initWithString:theHost];
- sshLogin = [[NSString alloc] initWithString:theLogin];
+ sshLogin = [[NSString alloc] initWithString:(theLogin?theLogin:@"")];
sshPort = thePort;
if ([theHost isEqualToString:targetHost]) {
remoteHost = [[NSString alloc] initWithString:@"127.0.0.1"];
@@ -54,8 +54,8 @@
lastError = nil;
// Set up a connection for use by the tunnel process
- tunnelConnectionName = [NSString stringWithFormat:@"SequelPro-%f", [[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] hash]];
- tunnelConnectionVerifyHash = [NSString stringWithFormat:@"%f", [[NSString stringWithFormat:@"%f%i", [[NSDate date] timeIntervalSince1970]] hash]];
+ tunnelConnectionName = [[NSString alloc] initWithFormat:@"SequelPro-%f", [[NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]] hash]];
+ tunnelConnectionVerifyHash = [[NSString alloc] initWithFormat:@"%f", [[NSString stringWithFormat:@"%f%i", [[NSDate date] timeIntervalSince1970]] hash]];
tunnelConnection = [[NSConnection defaultConnection] retain];
[tunnelConnection runInNewThread];
[tunnelConnection removeRunLoop:[NSRunLoop currentRunLoop]];
@@ -140,6 +140,7 @@
*/
- (NSString *) lastError
{
+ if (!lastError) return nil;
return [NSString stringWithString:lastError];
}
@@ -219,7 +220,7 @@
[task setLaunchPath: @"/usr/bin/ssh"];
// Set up the arguments for the task
- taskArguments = [ NSMutableArray array ];
+ taskArguments = [[NSMutableArray alloc] init];
[taskArguments addObject:@"-N"]; // Tunnel only
[taskArguments addObject:@"-v"]; // Verbose mode for messages
// [taskArguments addObject:@"-C"]; // TODO: compression?
@@ -242,7 +243,7 @@
// Set up the environment for the task
authenticationAppPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"TunnelPassphraseRequester"];
- taskEnvironment = [NSMutableDictionary dictionaryWithDictionary:[[NSProcessInfo processInfo] environment]];
+ taskEnvironment = [[NSMutableDictionary alloc] initWithDictionary:[[NSProcessInfo processInfo] environment]];
[taskEnvironment removeObjectForKey: @"SSH_AGENT_PID"];
[taskEnvironment removeObjectForKey: @"SSH_AUTH_SOCK"];
[taskEnvironment setObject:authenticationAppPath forKey:@"SSH_ASKPASS"];
@@ -289,6 +290,7 @@
// If the task closed unexpectedly, alert appropriately
if (connectionState != SPSSH_STATE_IDLE) {
connectionState = SPSSH_STATE_IDLE;
+ if (lastError) [lastError release];
lastError = [[NSString alloc] initWithString:NSLocalizedString(@"The SSH Tunnel has unexpectedly closed.", @"SSH tunnel unexpectedly closed")];
if (delegate) [delegate performSelectorOnMainThread:stateChangeSelector withObject:self waitUntilDone:NO];
}
@@ -299,6 +301,8 @@
object:[standardError fileHandleForReading]];
[task release], task = nil;
[standardError release], standardError = nil;
+ [taskEnvironment release], taskEnvironment = nil;
+ [taskArguments release], taskArguments = nil;
[pool release];
}
@@ -472,7 +476,17 @@
}
- (void)dealloc
-{
+{
+ [sshHost release];
+ [sshLogin release];
+ [remoteHost release];
+ [tunnelConnectionName release];
+ [tunnelConnectionVerifyHash release];
+ [tunnelConnection release];
+ if (password) [password release];
+ if (keychainName) [keychainName release];
+ if (keychainAccount) [keychainAccount release];
+
[super dealloc];
}