1
1

When shutting down sub-systems and closing the channel try our best

to free any memory still allocated in the state variables
Этот коммит содержится в:
James Housley 2007-06-07 16:43:20 +00:00
родитель bb32d080fa
Коммит b2f3582a59
5 изменённых файлов: 125 добавлений и 0 удалений

Просмотреть файл

@ -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;

Просмотреть файл

@ -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;
}