When shutting down sub-systems and closing the channel try our best
to free any memory still allocated in the state variables
Этот коммит содержится в:
родитель
bb32d080fa
Коммит
b2f3582a59
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
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)
|
||||
{
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
/* }}} */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user