Mercurial > dropbear
diff common-session.c @ 910:89555751c489 asm
merge up to 2013.63, improve ASM makefile rules a bit
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 27 Feb 2014 21:35:58 +0800 |
parents | a1a97e98b0c1 |
children | bae0b34bc059 b8208506322e |
line wrap: on
line diff
--- a/common-session.c Sun Oct 06 22:32:03 2013 +0800 +++ b/common-session.c Thu Feb 27 21:35:58 2014 +0800 @@ -30,7 +30,7 @@ #include "buffer.h" #include "dss.h" #include "ssh.h" -#include "random.h" +#include "dbrandom.h" #include "kex.h" #include "channel.h" #include "runopts.h" @@ -82,7 +82,7 @@ initqueue(&ses.writequeue); - ses.requirenext[0] = SSH_MSG_KEXINIT; + ses.requirenext = SSH_MSG_KEXINIT; ses.dataallowed = 1; /* we can send data until we actually send the SSH_MSG_KEXINIT */ ses.ignorenext = 0; @@ -101,7 +101,7 @@ ses.keys->recv.algo_mac = &dropbear_nohash; ses.keys->trans.algo_mac = &dropbear_nohash; - ses.keys->algo_kex = -1; + ses.keys->algo_kex = NULL; ses.keys->algo_hostkey = -1; ses.keys->recv.algo_comp = DROPBEAR_COMP_NONE; ses.keys->trans.algo_comp = DROPBEAR_COMP_NONE; @@ -153,10 +153,9 @@ SIGCHLD in svr-chansession is the only one currently. */ FD_SET(ses.signal_pipe[0], &readfd); - /* set up for channels which require reading/writing */ - if (ses.dataallowed) { - setchannelfds(&readfd, &writefd); - } + /* set up for channels which can be read/written */ + setchannelfds(&readfd, &writefd); + val = select(ses.maxfd+1, &readfd, &writefd, NULL, &timeout); if (exitflag) { @@ -217,9 +216,7 @@ /* process pipes etc for the channels, ses.dataallowed == 0 * during rekeying ) */ - if (ses.dataallowed) { - channelio(&readfd, &writefd); - } + channelio(&readfd, &writefd); if (loophandler) { loophandler(); @@ -244,20 +241,31 @@ if (ses.extra_session_cleanup) { ses.extra_session_cleanup(); } + + chancleanup(); - m_free(ses.session_id); + /* Cleaning up keys must happen after other cleanup + functions which might queue packets */ + if (ses.session_id) { + buf_burn(ses.session_id); + buf_free(ses.session_id); + ses.session_id = NULL; + } + if (ses.hash) { + buf_burn(ses.hash); + buf_free(ses.hash); + ses.hash = NULL; + } m_burn(ses.keys, sizeof(struct key_context)); m_free(ses.keys); - chancleanup(); - TRACE(("leave session_cleanup")) } void send_session_identification() { buffer *writebuf = buf_new(strlen(LOCAL_IDENT "\r\n") + 1); buf_putbytes(writebuf, LOCAL_IDENT "\r\n", strlen(LOCAL_IDENT "\r\n")); - buf_putbyte(writebuf, 0x0); // packet type + buf_putbyte(writebuf, 0x0); /* packet type */ buf_setpos(writebuf, 0); enqueue(&ses.writequeue, writebuf); }