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:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user