Mercurial > dropbear
diff packet.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 | 4696755c4cac |
children | b8208506322e |
line wrap: on
line diff
--- a/packet.c Sun Oct 06 22:32:03 2013 +0800 +++ b/packet.c Thu Feb 27 21:35:58 2014 +0800 @@ -30,7 +30,7 @@ #include "algo.h" #include "buffer.h" #include "kex.h" -#include "random.h" +#include "dbrandom.h" #include "service.h" #include "auth.h" #include "channel.h" @@ -41,7 +41,11 @@ unsigned char *output_mac); static int checkmac(); -#define ZLIB_COMPRESS_INCR 100 +/* For exact details see http://www.zlib.net/zlib_tech.html + * 5 bytes per 16kB block, plus 6 bytes for the stream. + * We might allocate 5 unnecessary bytes here if it's an + * exact multiple. */ +#define ZLIB_COMPRESS_EXPANSION (((RECV_MAX_PAYLOAD_LEN/16384)+1)*5 + 6) #define ZLIB_DECOMPRESS_INCR 1024 #ifndef DISABLE_ZLIB static buffer* buf_decompress(buffer* buf, unsigned int len); @@ -98,7 +102,7 @@ writebuf = (buffer*)examine(&ses.writequeue); len = writebuf->len - 1 - writebuf->pos; if (len > written) { - // partial buffer write + /* partial buffer write */ buf_incrpos(writebuf, written); written = 0; } else { @@ -333,7 +337,7 @@ /* payload length */ /* - 4 - 1 is for LEN and PADLEN values */ len = ses.readbuf->len - padlen - 4 - 1 - macsize; - if ((len > RECV_MAX_PAYLOAD_LEN) || (len < 1)) { + if ((len > RECV_MAX_PAYLOAD_LEN+ZLIB_COMPRESS_EXPANSION) || (len < 1)) { dropbear_exit("Bad packet size %d", len); } @@ -422,6 +426,8 @@ if (zstream->avail_out == 0) { int new_size = 0; if (ret->size >= RECV_MAX_PAYLOAD_LEN) { + /* Already been increased as large as it can go, + * yet didn't finish up the decompression */ dropbear_exit("bad packet, oversized decompressed"); } new_size = MIN(RECV_MAX_PAYLOAD_LEN, ret->size + ZLIB_DECOMPRESS_INCR); @@ -526,7 +532,7 @@ + mac_size #ifndef DISABLE_ZLIB /* some extra in case 'compression' makes it larger */ - + ZLIB_COMPRESS_INCR + + ZLIB_COMPRESS_EXPANSION #endif /* and an extra cleartext (stripped before transmission) byte for the * packet type */ @@ -539,14 +545,7 @@ #ifndef DISABLE_ZLIB /* compression */ if (is_compress_trans()) { - int compress_delta; buf_compress(writebuf, ses.writepayload, ses.writepayload->len); - compress_delta = (writebuf->len - PACKET_PAYLOAD_OFF) - ses.writepayload->len; - - /* Handle the case where 'compress' increased the size. */ - if (compress_delta > ZLIB_COMPRESS_INCR) { - buf_resize(writebuf, writebuf->size + compress_delta); - } } else #endif { @@ -694,7 +693,7 @@ /* the buffer has been filled, we must extend. This only happens in * unusual circumstances where the data grows in size after deflate(), * but it is possible */ - buf_resize(dest, dest->size + ZLIB_COMPRESS_INCR); + buf_resize(dest, dest->size + ZLIB_COMPRESS_EXPANSION); } TRACE2(("leave buf_compress"))