diff --git a/src/channel.c b/src/channel.c index c8c4d4e..70d5045 100644 --- a/src/channel.c +++ b/src/channel.c @@ -1697,6 +1697,25 @@ LIBSSH2_API int libssh2_channel_free(LIBSSH2_CHANNEL *channel) 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); return 0; diff --git a/src/publickey.c b/src/publickey.c index cb593f6..31db3d6 100644 --- a/src/publickey.c +++ b/src/publickey.c @@ -864,6 +864,22 @@ LIBSSH2_API void libssh2_publickey_shutdown(LIBSSH2_PUBLICKEY *pkey) { 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_FREE(session, pkey); } diff --git a/src/session.c b/src/session.c index d76e055..ba180d7 100644 --- a/src/session.c +++ b/src/session.c @@ -576,10 +576,12 @@ LIBSSH2_API int libssh2_session_startup(LIBSSH2_SESSION *session, int socket) if ((session->startup_service_length != (sizeof("ssh-userauth") - 1)) || strncmp("ssh-userauth", (char *)session->startup_data + 5, session->startup_service_length)) { LIBSSH2_FREE(session, session->startup_data); + session->startup_data = NULL; libssh2_error(session, LIBSSH2_ERROR_PROTO, "Invalid response received from server", 0); return LIBSSH2_ERROR_PROTO; } LIBSSH2_FREE(session, session->startup_data); + session->startup_data = NULL; 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); } + /* + * 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 */ while (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); + session->disconnect_data = NULL; session->disconnect_state = libssh2_NB_state_idle; return 0; diff --git a/src/sftp.c b/src/sftp.c index ef24037..bcfc649 100644 --- a/src/sftp.c +++ b/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) { + /* + * 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); } /* }}} */ diff --git a/src/userauth.c b/src/userauth.c index d13e880..83e6d00 100644 --- a/src/userauth.c +++ b/src/userauth.c @@ -274,6 +274,7 @@ libssh2_userauth_password_ex(LIBSSH2_SESSION *session, const char *username, uns libssh2_error(session, LIBSSH2_ERROR_ALLOC, "Unable to allocate memory for userauth-password-change request", 0); LIBSSH2_FREE(session, session->userauth_newpw); + session->userauth_newpw = NULL; return -1; }