aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2011-09-07 01:26:43 +0200
committerYang Tse <yangsita@gmail.com>2011-09-07 01:26:43 +0200
commit5658aa95741cc2d69f4a70d7e7ba6dfb773258e3 (patch)
treefa2e4d58593498af981f4dec0e24fdbd0a46a1e0 /lib
parent653904769492d02317b7ec6274f49938d4a58585 (diff)
ssh.c: fix memory leaks triggered upon OOM or other failures
Diffstat (limited to 'lib')
-rw-r--r--lib/ssh.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/lib/ssh.c b/lib/ssh.c
index 8a903e554..089b76110 100644
--- a/lib/ssh.c
+++ b/lib/ssh.c
@@ -2388,10 +2388,39 @@ static CURLcode ssh_statemach_act(struct connectdata *conn, bool *block)
}
sshc->ssh_session = NULL;
}
+
+ /* worst-case scenario cleanup */
+
+ DEBUGASSERT(sshc->ssh_session == NULL);
+ DEBUGASSERT(sshc->ssh_channel == NULL);
+ DEBUGASSERT(sshc->sftp_session == NULL);
+ DEBUGASSERT(sshc->sftp_handle == NULL);
+#ifdef HAVE_LIBSSH2_KNOWNHOST_API
+ DEBUGASSERT(sshc->kh == NULL);
+#endif
+
+ Curl_safefree(sshc->rsa_pub);
+ Curl_safefree(sshc->rsa);
+
+ Curl_safefree(sshc->quote_path1);
+ Curl_safefree(sshc->quote_path2);
+
+ Curl_safefree(sshc->homedir);
+
+ Curl_safefree(sshc->readdir_filename);
+ Curl_safefree(sshc->readdir_longentry);
+ Curl_safefree(sshc->readdir_line);
+ Curl_safefree(sshc->readdir_linkPath);
+
+ /* the code we are about to return */
+ result = sshc->actualcode;
+
+ memset(sshc, 0, sizeof(struct ssh_conn));
+
conn->bits.close = TRUE;
+ sshc->state = SSH_SESSION_FREE; /* current */
sshc->nextstate = SSH_NO_STATE;
state(conn, SSH_STOP);
- result = sshc->actualcode;
break;
case SSH_QUIT: