# HG changeset patch # User Matt Johnston # Date 1235650714 0 # Node ID 22a0d8355c2cd3d2195ad0c5a22ed3bcca2f35fe # Parent da6340a60039c481f7cb0c12a91138525cca5c39# Parent 378a6389f88ef7aa9b5de47a54244c0d7b82430c merge of 'a101cbd046507cf723e6362a49196dbd4b924042' and 'c8e1b84cfe874887ad7df0dd95a00de46dbc0136' diff -r 378a6389f88e -r 22a0d8355c2c common-session.c --- a/common-session.c Wed Feb 25 14:04:02 2009 +0000 +++ b/common-session.c Thu Feb 26 12:18:34 2009 +0000 @@ -189,7 +189,7 @@ /* process session socket's incoming/outgoing data */ if (ses.sock_out != -1) { if (FD_ISSET(ses.sock_out, &writefd) && !isempty(&ses.writequeue)) { - write_packet(); + write_packets(); } } diff -r 378a6389f88e -r 22a0d8355c2c packet.c --- a/packet.c Wed Feb 25 14:04:02 2009 +0000 +++ b/packet.c Thu Feb 26 12:18:34 2009 +0000 @@ -46,14 +46,16 @@ static void buf_compress(buffer * dest, buffer * src, unsigned int len); #endif -/* non-blocking function writing out a current encrypted packet */ -void write_packet() { +/* non-blocking function writing out a current encrypted packet. Returns + * DROPBEAR_SUCCESS if entire packet was written, DROPBEAR_FAILURE + * otherwise */ +static int write_packet() { int len, written; + int ret = DROPBEAR_FAILURE; buffer * writebuf = NULL; TRACE(("enter write_packet")) - dropbear_assert(!isempty(&ses.writequeue)); /* Get the next buffer in the queue of encrypted packets to write*/ writebuf = (buffer*)examine(&ses.writequeue); @@ -84,12 +86,19 @@ dequeue(&ses.writequeue); buf_free(writebuf); writebuf = NULL; + ret = DROPBEAR_SUCCESS; } else { /* More packet left to write, leave it in the queue for later */ buf_incrpos(writebuf, written); } TRACE(("leave write_packet")) + return ret; +} + +void write_packets() { + /* keep writing packets while we can. */ + while (!isempty(&ses.writequeue) && write_packet() == DROPBEAR_SUCCESS) {} } /* Non-blocking function reading available portion of a packet into the diff -r 378a6389f88e -r 22a0d8355c2c packet.h --- a/packet.h Wed Feb 25 14:04:02 2009 +0000 +++ b/packet.h Thu Feb 26 12:18:34 2009 +0000 @@ -28,7 +28,7 @@ #include "includes.h" -void write_packet(); +void write_packets(); void read_packet(); void decrypt_packet(); void encrypt_packet();