mirror of
				https://github.com/libssh2/libssh2.git
				synced 2025-11-03 22:13:11 +03:00 
			
		
		
		
	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:
		@@ -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;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user