diff --git a/src/comp.c b/src/comp.c index 836c5c7c..22aa9f8b 100644 --- a/src/comp.c +++ b/src/comp.c @@ -170,6 +170,15 @@ comp_method_zlib_comp(LIBSSH2_SESSION * session, int out_maxlen = compress ? (src_len + 4) : (2 * src_len); int limiter = 0; + /* If strm is null, then we have not yet been initialized. */ + if (strm == NULL) { + *dest = (unsigned char *) src; + *dest_len = src_len; + + *free_dest = 0; + return 0; + } + /* In practice they never come smaller than this */ if (out_maxlen < 25) { out_maxlen = 25; diff --git a/src/kex.c b/src/kex.c index a837e82d..e81a7107 100644 --- a/src/kex.c +++ b/src/kex.c @@ -600,6 +600,40 @@ static int diffie_hellman_sha1(LIBSSH2_SESSION *session, } _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Server to Client HMAC Key calculated"); + + /* Initialize compression for each direction */ + + /* Cleanup any existing compression */ + if (session->local.comp && session->local.comp->dtor) { + session->local.comp->dtor(session, 1, + &session->local.comp_abstract); + } + + if (session->local.comp && session->local.comp->init) { + if (session->local.comp->init(session, 1, + &session->local.comp_abstract)) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Client to Server compression initialized"); + + if (session->remote.comp && session->remote.comp->dtor) { + session->remote.comp->dtor(session, 0, + &session->remote.comp_abstract); + } + + if (session->remote.comp && session->remote.comp->init) { + if (session->remote.comp->init(session, 0, + &session->remote.comp_abstract)) { + ret = LIBSSH2_ERROR_KEX_FAILURE; + goto clean_exit; + } + } + _libssh2_debug(session, LIBSSH2_TRACE_KEX, + "Server to Client compression initialized"); + } clean_exit: @@ -1609,18 +1643,6 @@ static int kex_agree_methods(LIBSSH2_SESSION * session, unsigned char *data, _libssh2_debug(session, LIBSSH2_TRACE_KEX, "Agreed on COMP_SC method: %s", session->remote.comp->name); - /* Initialize compression layer */ - if (session->local.comp && session->local.comp->init && - session->local.comp->init(session, 1, &session->local.comp_abstract)) { - return -1; - } - - if (session->remote.comp && session->remote.comp->init && - session->remote.comp->init(session, 0, - &session->remote.comp_abstract)) { - return -1; - } - return 0; }