Hi Andreas,
Here's the patch compliant to your coding style. And I'm glad it helped you Jijo. Regards, Meng ________________________________ De : Andreas Schneider <[email protected]> Envoyé : mercredi 24 octobre 2018 08:51 À : [email protected] Cc : Meng Hourk Tan; [email protected] Objet : Re: libssh 0.8.4 with Cisco router On Tuesday, 23 October 2018 18:09:25 CEST Meng Hourk Tan wrote: > Hello, Hello Meng, > I had the same issue with some Cisco router: > > Some Cisco IOS do not send kex if they send the banner last (libssh as a > client sent it first). > > In this situation, both libssh client and Cisco IOS server hang. > > Libssh client should send kex init as soon as banners are exchanged. Thanks you very much for your patch. Could you please change the patch to follow our coding style: + if (ssh_set_client_kex(session) < 0) { + goto error; + } should for example use a helper variable for easier debugging: rc = ssh_set_client_kex(session); if (rc != SSH_OK) { goto error; } Thanks, Andreas -- Andreas Schneider [email protected] GPG-ID: 8DFF53E18F2ABC8D8F3C92237EE0FC4DCC014E3D
From c12bb4c2c1d3e2a7ac03ab7400c6be023f21df12 Mon Sep 17 00:00:00 2001 From: Meng Tan <[email protected]> Date: Wed, 24 Oct 2018 10:43:17 +0200 Subject: [PATCH] client: Send KEX as soon as banners are exchanged Signed-off-by: Meng Tan <[email protected]> --- src/client.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/client.c b/src/client.c index 859a86c6..d4b7ee57 100644 --- a/src/client.c +++ b/src/client.c @@ -411,6 +411,14 @@ static void ssh_client_connection_callback(ssh_session session) ssh_packet_set_default_callbacks(session); session->session_state = SSH_SESSION_STATE_INITIAL_KEX; + rc = ssh_set_client_kex(session); + if (rc != SSH_OK) { + goto error; + } + rc = ssh_send_kex(session, 0); + if (rc < 0) { + goto error; + } set_status(session, 0.5f); break; @@ -420,14 +428,19 @@ static void ssh_client_connection_callback(ssh_session session) case SSH_SESSION_STATE_KEXINIT_RECEIVED: set_status(session,0.6f); ssh_list_kex(&session->next_crypto->server_kex); - if (ssh_set_client_kex(session) < 0) { - goto error; + if (session->next_crypto->client_kex.methods[0] == NULL) { + /* in rekeying state if next_crypto client_kex is empty */ + rc = ssh_set_client_kex(session); + if (rc != SSH_OK) { + goto error; + } + rc = ssh_send_kex(session, 0); + if (rc < 0) { + goto error; + } } if (ssh_kex_select_methods(session) == SSH_ERROR) goto error; - if (ssh_send_kex(session, 0) < 0) { - goto error; - } set_status(session,0.8f); session->session_state=SSH_SESSION_STATE_DH; if (dh_handshake(session) == SSH_ERROR) { -- 2.11.0
