When shutting down sub-systems and closing the channel try our best
to free any memory still allocated in the state variables
This commit is contained in:
parent
bb32d080fa
commit
b2f3582a59
@ -1697,6 +1697,25 @@ LIBSSH2_API int libssh2_channel_free(LIBSSH2_CHANNEL *channel)
|
|||||||
session->channels.tail = channel->prev;
|
session->channels.tail = channel->prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure all memory used in the state variables are free
|
||||||
|
*/
|
||||||
|
if (channel->setenv_packet) {
|
||||||
|
LIBSSH2_FREE(session, channel->setenv_packet);
|
||||||
|
}
|
||||||
|
if (channel->reqPTY_packet) {
|
||||||
|
LIBSSH2_FREE(session, channel->reqPTY_packet);
|
||||||
|
}
|
||||||
|
if (channel->reqX11_packet) {
|
||||||
|
LIBSSH2_FREE(session, channel->reqX11_packet);
|
||||||
|
}
|
||||||
|
if (channel->process_packet) {
|
||||||
|
LIBSSH2_FREE(session, channel->process_packet);
|
||||||
|
}
|
||||||
|
if (channel->write_packet) {
|
||||||
|
LIBSSH2_FREE(session, channel->write_packet);
|
||||||
|
}
|
||||||
|
|
||||||
LIBSSH2_FREE(session, channel);
|
LIBSSH2_FREE(session, channel);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -864,6 +864,22 @@ LIBSSH2_API void libssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey)
|
|||||||
{
|
{
|
||||||
LIBSSH2_SESSION *session = pkey->channel->session;
|
LIBSSH2_SESSION *session = pkey->channel->session;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure all memory used in the state variables are free
|
||||||
|
*/
|
||||||
|
if (pkey->receive_packet) {
|
||||||
|
LIBSSH2_FREE(session, pkey->receive_packet);
|
||||||
|
}
|
||||||
|
if (pkey->add_packet) {
|
||||||
|
LIBSSH2_FREE(session, pkey->add_packet);
|
||||||
|
}
|
||||||
|
if (pkey->remove_packet) {
|
||||||
|
LIBSSH2_FREE(session, pkey->remove_packet);
|
||||||
|
}
|
||||||
|
if (pkey->listFetch_data) {
|
||||||
|
LIBSSH2_FREE(session, pkey->listFetch_data);
|
||||||
|
}
|
||||||
|
|
||||||
libssh2_channel_free(pkey->channel);
|
libssh2_channel_free(pkey->channel);
|
||||||
LIBSSH2_FREE(session, pkey);
|
LIBSSH2_FREE(session, pkey);
|
||||||
}
|
}
|
||||||
|
@ -576,10 +576,12 @@ LIBSSH2_API int libssh2_session_startup(LIBSSH2_SESSION *session, int socket)
|
|||||||
if ((session->startup_service_length != (sizeof("ssh-userauth") - 1)) ||
|
if ((session->startup_service_length != (sizeof("ssh-userauth") - 1)) ||
|
||||||
strncmp("ssh-userauth", (char *)session->startup_data + 5, session->startup_service_length)) {
|
strncmp("ssh-userauth", (char *)session->startup_data + 5, session->startup_service_length)) {
|
||||||
LIBSSH2_FREE(session, session->startup_data);
|
LIBSSH2_FREE(session, session->startup_data);
|
||||||
|
session->startup_data = NULL;
|
||||||
libssh2_error(session, LIBSSH2_ERROR_PROTO, "Invalid response received from server", 0);
|
libssh2_error(session, LIBSSH2_ERROR_PROTO, "Invalid response received from server", 0);
|
||||||
return LIBSSH2_ERROR_PROTO;
|
return LIBSSH2_ERROR_PROTO;
|
||||||
}
|
}
|
||||||
LIBSSH2_FREE(session, session->startup_data);
|
LIBSSH2_FREE(session, session->startup_data);
|
||||||
|
session->startup_data = NULL;
|
||||||
|
|
||||||
session->startup_state = libssh2_NB_state_idle;
|
session->startup_state = libssh2_NB_state_idle;
|
||||||
|
|
||||||
@ -702,6 +704,52 @@ LIBSSH2_API void libssh2_session_free(LIBSSH2_SESSION *session)
|
|||||||
LIBSSH2_FREE(session, session->remote.lang_prefs);
|
LIBSSH2_FREE(session, session->remote.lang_prefs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure all memory used in the state variables are free
|
||||||
|
*/
|
||||||
|
if (session->startup_data) {
|
||||||
|
LIBSSH2_FREE(session, session->startup_data);
|
||||||
|
}
|
||||||
|
if (session->disconnect_data) {
|
||||||
|
LIBSSH2_FREE(session, session->disconnect_data);
|
||||||
|
}
|
||||||
|
if (session->userauth_data) {
|
||||||
|
LIBSSH2_FREE(session, session->userauth_data);
|
||||||
|
}
|
||||||
|
if (session->userauth_newpw) {
|
||||||
|
LIBSSH2_FREE(session, session->userauth_newpw);
|
||||||
|
}
|
||||||
|
if (session->userauth_packet) {
|
||||||
|
LIBSSH2_FREE(session, session->userauth_packet);
|
||||||
|
}
|
||||||
|
if (session->userauth_method) {
|
||||||
|
LIBSSH2_FREE(session, session->userauth_method);
|
||||||
|
}
|
||||||
|
if (session->userauth_auth_instruction) {
|
||||||
|
LIBSSH2_FREE(session, session->userauth_auth_instruction);
|
||||||
|
}
|
||||||
|
if (session->open_packet) {
|
||||||
|
LIBSSH2_FREE(session, session->open_packet);
|
||||||
|
}
|
||||||
|
if (session->open_data) {
|
||||||
|
LIBSSH2_FREE(session, session->open_data);
|
||||||
|
}
|
||||||
|
if (session->direct_message) {
|
||||||
|
LIBSSH2_FREE(session, session->direct_message);
|
||||||
|
}
|
||||||
|
if (session->fwdLstn_packet) {
|
||||||
|
LIBSSH2_FREE(session, session->fwdLstn_packet);
|
||||||
|
}
|
||||||
|
if (session->pkeyInit_data) {
|
||||||
|
LIBSSH2_FREE(session, session->pkeyInit_data);
|
||||||
|
}
|
||||||
|
if (session->scpRecv_command) {
|
||||||
|
LIBSSH2_FREE(session, session->scpRecv_command);
|
||||||
|
}
|
||||||
|
if (session->scpSend_command) {
|
||||||
|
LIBSSH2_FREE(session, session->scpSend_command);
|
||||||
|
}
|
||||||
|
|
||||||
/* Cleanup any remaining packets */
|
/* Cleanup any remaining packets */
|
||||||
while (session->packets.head) {
|
while (session->packets.head) {
|
||||||
LIBSSH2_PACKET *tmp = session->packets.head;
|
LIBSSH2_PACKET *tmp = session->packets.head;
|
||||||
@ -768,6 +816,7 @@ LIBSSH2_API int libssh2_session_disconnect_ex(LIBSSH2_SESSION *session, int reas
|
|||||||
}
|
}
|
||||||
|
|
||||||
LIBSSH2_FREE(session, session->disconnect_data);
|
LIBSSH2_FREE(session, session->disconnect_data);
|
||||||
|
session->disconnect_data = NULL;
|
||||||
session->disconnect_state = libssh2_NB_state_idle;
|
session->disconnect_state = libssh2_NB_state_idle;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
40
src/sftp.c
40
src/sftp.c
@ -656,6 +656,46 @@ LIBSSH2_API LIBSSH2_SFTP *libssh2_sftp_init(LIBSSH2_SESSION *session)
|
|||||||
*/
|
*/
|
||||||
LIBSSH2_API int libssh2_sftp_shutdown(LIBSSH2_SFTP *sftp)
|
LIBSSH2_API int libssh2_sftp_shutdown(LIBSSH2_SFTP *sftp)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Make sure all memory used in the state variables are free
|
||||||
|
*/
|
||||||
|
if (sftp->partial_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->partial_packet);
|
||||||
|
}
|
||||||
|
if (sftp->open_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->open_packet);
|
||||||
|
}
|
||||||
|
if (sftp->read_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->read_packet);
|
||||||
|
}
|
||||||
|
if (sftp->readdir_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->readdir_packet);
|
||||||
|
}
|
||||||
|
if (sftp->write_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->write_packet);
|
||||||
|
}
|
||||||
|
if (sftp->fstat_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->fstat_packet);
|
||||||
|
}
|
||||||
|
if (sftp->unlink_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->unlink_packet);
|
||||||
|
}
|
||||||
|
if (sftp->rename_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->rename_packet);
|
||||||
|
}
|
||||||
|
if (sftp->mkdir_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->mkdir_packet);
|
||||||
|
}
|
||||||
|
if (sftp->rmdir_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->rmdir_packet);
|
||||||
|
}
|
||||||
|
if (sftp->stat_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->stat_packet);
|
||||||
|
}
|
||||||
|
if (sftp->symlink_packet) {
|
||||||
|
LIBSSH2_FREE(sftp->channel->session, sftp->symlink_packet);
|
||||||
|
}
|
||||||
|
|
||||||
return libssh2_channel_free(sftp->channel);
|
return libssh2_channel_free(sftp->channel);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
@ -274,6 +274,7 @@ libssh2_userauth_password_ex(LIBSSH2_SESSION *session, const char *username, uns
|
|||||||
libssh2_error(session, LIBSSH2_ERROR_ALLOC,
|
libssh2_error(session, LIBSSH2_ERROR_ALLOC,
|
||||||
"Unable to allocate memory for userauth-password-change request", 0);
|
"Unable to allocate memory for userauth-password-change request", 0);
|
||||||
LIBSSH2_FREE(session, session->userauth_newpw);
|
LIBSSH2_FREE(session, session->userauth_newpw);
|
||||||
|
session->userauth_newpw = NULL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user