mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
ssh: ignore timeouts during disconnect
... as otherwise it risks not cleaning up the libssh2 handle properly which leads to memory leak! Assisted-by: Joel Depooter Closes #1495 Closes #1479 Bug: https://curl.haxx.se/mail/lib-2017-04/0024.html
This commit is contained in:
parent
e5491e0f9c
commit
f31760e63b
11
lib/ssh.c
11
lib/ssh.c
@ -113,6 +113,7 @@
|
|||||||
libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
|
libssh2_sftp_symlink_ex((s), (p), curlx_uztoui(strlen(p)), \
|
||||||
(t), (m), LIBSSH2_SFTP_REALPATH)
|
(t), (m), LIBSSH2_SFTP_REALPATH)
|
||||||
|
|
||||||
|
|
||||||
/* Local functions: */
|
/* Local functions: */
|
||||||
static const char *sftp_libssh2_strerror(int err);
|
static const char *sftp_libssh2_strerror(int err);
|
||||||
static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
|
static LIBSSH2_ALLOC_FUNC(my_libssh2_malloc);
|
||||||
@ -2815,7 +2816,7 @@ static CURLcode ssh_multi_statemach(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode ssh_block_statemach(struct connectdata *conn,
|
static CURLcode ssh_block_statemach(struct connectdata *conn,
|
||||||
bool duringconnect)
|
bool disconnect)
|
||||||
{
|
{
|
||||||
struct ssh_conn *sshc = &conn->proto.sshc;
|
struct ssh_conn *sshc = &conn->proto.sshc;
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
@ -2830,6 +2831,7 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
|
|||||||
if(result)
|
if(result)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if(!disconnect) {
|
||||||
if(Curl_pgrsUpdate(conn))
|
if(Curl_pgrsUpdate(conn))
|
||||||
return CURLE_ABORTED_BY_CALLBACK;
|
return CURLE_ABORTED_BY_CALLBACK;
|
||||||
|
|
||||||
@ -2837,11 +2839,12 @@ static CURLcode ssh_block_statemach(struct connectdata *conn,
|
|||||||
if(result)
|
if(result)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
left = Curl_timeleft(data, NULL, duringconnect);
|
left = Curl_timeleft(data, NULL, FALSE);
|
||||||
if(left < 0) {
|
if(left < 0) {
|
||||||
failf(data, "Operation timed out");
|
failf(data, "Operation timed out");
|
||||||
return CURLE_OPERATION_TIMEDOUT;
|
return CURLE_OPERATION_TIMEDOUT;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
|
#ifdef HAVE_LIBSSH2_SESSION_BLOCK_DIRECTION
|
||||||
if(!result && block) {
|
if(!result && block) {
|
||||||
@ -3056,7 +3059,7 @@ static CURLcode scp_disconnect(struct connectdata *conn, bool dead_connection)
|
|||||||
|
|
||||||
state(conn, SSH_SESSION_DISCONNECT);
|
state(conn, SSH_SESSION_DISCONNECT);
|
||||||
|
|
||||||
result = ssh_block_statemach(conn, FALSE);
|
result = ssh_block_statemach(conn, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -3210,7 +3213,7 @@ static CURLcode sftp_disconnect(struct connectdata *conn, bool dead_connection)
|
|||||||
if(conn->proto.sshc.ssh_session) {
|
if(conn->proto.sshc.ssh_session) {
|
||||||
/* only if there's a session still around to use! */
|
/* only if there's a session still around to use! */
|
||||||
state(conn, SSH_SFTP_SHUTDOWN);
|
state(conn, SSH_SFTP_SHUTDOWN);
|
||||||
result = ssh_block_statemach(conn, FALSE);
|
result = ssh_block_statemach(conn, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));
|
DEBUGF(infof(conn->data, "SSH DISCONNECT is done\n"));
|
||||||
|
Loading…
Reference in New Issue
Block a user