Index: kex.c
===================================================================
RCS file: /cvsroot/libssh2/libssh2/src/kex.c,v
retrieving revision 1.36
diff -u -r1.36 kex.c
--- kex.c	18 Nov 2007 20:57:13 -0000	1.36
+++ kex.c	26 Jun 2008 21:32:50 -0000
@@ -1680,6 +1680,8 @@
     int rc = 0;
     int retcode;
 
+    session->state |= LIBSSH2_STATE_KEX_ACTIVE;
+
     if (key_state->state == libssh2_NB_state_idle) {
         /* Prevent loop in packet_add() */
         session->state |= LIBSSH2_STATE_EXCHANGING_KEYS;
@@ -1711,11 +1713,14 @@
         if (key_state->state == libssh2_NB_state_sent) {
             retcode = libssh2_kexinit(session);
             if (retcode == PACKET_EAGAIN) {
+                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;
                 return PACKET_EAGAIN;
             } else if (retcode) {
                 session->local.kexinit = key_state->oldlocal;
                 session->local.kexinit_len = key_state->oldlocal_len;
                 key_state->state = libssh2_NB_state_idle;
+                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;
+                session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;
                 return -1;
             }
 
@@ -1729,6 +1734,7 @@
                                           &key_state->data_len, 0, NULL, 0,
                                           &key_state->req_state);
             if (retcode == PACKET_EAGAIN) {
+                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;
                 return PACKET_EAGAIN;
             } else if (retcode) {
                 if (session->local.kexinit) {
@@ -1737,6 +1743,8 @@
                 session->local.kexinit = key_state->oldlocal;
                 session->local.kexinit_len = key_state->oldlocal_len;
                 key_state->state = libssh2_NB_state_idle;
+                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;
+                session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;
                 return -1;
             }
 
@@ -1763,6 +1771,7 @@
                 session->kex->exchange_keys(session,
                                             &key_state->key_state_low);
             if (retcode == PACKET_EAGAIN) {
+                session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;
                 return PACKET_EAGAIN;
             } else if (retcode) {
                 libssh2_error(session, LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE,
@@ -1782,6 +1791,7 @@
         session->remote.kexinit = NULL;
     }
 
+    session->state &= ~LIBSSH2_STATE_KEX_ACTIVE;
     session->state &= ~LIBSSH2_STATE_EXCHANGING_KEYS;
 
     key_state->state = libssh2_NB_state_idle;

