summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMatt Johnston <matt@ucc.asn.au>2011-02-28 13:51:34 +0000
committerMatt Johnston <matt@ucc.asn.au>2011-02-28 13:51:34 +0000
commit0993e44b4f14478d22b9c5877f672443c9d24898 (patch)
treebb532069dd7a4814756e46eb7b31388290641006
parent53fc7eaf03d039dee4da8491856a77f31beb8854 (diff)
parentd634b502cff62bea8c1f6665f12b860af5542bb2 (diff)
merge of '8a608f0ed5e4b491dba4bf330e560636ec7376fd'
and 'b31879a384d3bf8cbcbe2ed731d7d79d49799b1d' --HG-- extra : convert_revision : dfa0557e6070859d23ff096789f339e51a870177
-rw-r--r--options.h14
-rw-r--r--packet.c20
-rw-r--r--sysoptions.h4
3 files changed, 23 insertions, 15 deletions
diff --git a/options.h b/options.h
index 8b49f30..d309ab4 100644
--- a/options.h
+++ b/options.h
@@ -133,19 +133,15 @@ much traffic. */
/* #define DSS_PROTOK */
/* Control the memory/performance/compression tradeoff for zlib.
- * Set windowBits=8, memLevel=1 for least memory usage, see your system's
+ * Set windowBits=8 for least memory usage, see your system's
* zlib.h for full details.
- * Default settings (windowBits=15, memLevel=8) will use
- * 256kB for compression + 32kB for decompression.
- * windowBits=8, memLevel=1 will use 10kB compression + 32kB decompression.
- * Note that windowBits is only set for deflate() - inflate() always uses the
- * default of 15 so as to interoperate with other clients. */
+ * Default settings (windowBits=15) will use 256kB for compression
+ * windowBits=8 will use 129kB for compression.
+ * Both modes will use ~35kB for decompression (using windowBits=15 for
+ * interoperability) */
#ifndef DROPBEAR_ZLIB_WINDOW_BITS
#define DROPBEAR_ZLIB_WINDOW_BITS 15
#endif
-#ifndef DROPBEAR_ZLIB_MEM_LEVEL
-#define DROPBEAR_ZLIB_MEM_LEVEL 8
-#endif
/* Whether to do reverse DNS lookups. */
#define DO_HOST_LOOKUP
diff --git a/packet.c b/packet.c
index d4f660a..80eb177 100644
--- a/packet.c
+++ b/packet.c
@@ -41,7 +41,7 @@ static void make_mac(unsigned int seqno, const struct key_context_directional *
unsigned char *output_mac);
static int checkmac();
-#define ZLIB_COMPRESS_INCR 20 /* this is 12 bytes + 0.1% of 8000 bytes */
+#define ZLIB_COMPRESS_INCR 100
#define ZLIB_DECOMPRESS_INCR 100
#ifndef DISABLE_ZLIB
static buffer* buf_decompress(buffer* buf, unsigned int len);
@@ -452,14 +452,15 @@ void encrypt_packet() {
blocksize = ses.keys->trans.algo_crypt->blocksize;
mac_size = ses.keys->trans.algo_mac->hashsize;
- /* Encrypted packet len is payload+5, then worst case is if we are 3 away
- * from a blocksize multiple. In which case we need to pad to the
- * multiple, then add another blocksize (or MIN_PACKET_LEN) */
- encrypt_buf_size = (ses.writepayload->len+4+1) + MIN_PACKET_LEN + 3
+ /* Encrypted packet len is payload+5. We need to then make sure
+ * there is enough space for padding or MIN_PACKET_LEN.
+ * Add extra 3 since we need at least 4 bytes of padding */
+ encrypt_buf_size = (ses.writepayload->len+4+1)
+ + MAX(MIN_PACKET_LEN, blocksize) + 3
/* add space for the MAC at the end */
+ mac_size
#ifndef DISABLE_ZLIB
- /* zlib compression could lengthen the payload in some cases */
+ /* some extra in case 'compression' makes it larger */
+ ZLIB_COMPRESS_INCR
#endif
/* and an extra cleartext (stripped before transmission) byte for the
@@ -473,7 +474,14 @@ void encrypt_packet() {
#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
{
diff --git a/sysoptions.h b/sysoptions.h
index 216ab64..ce2c045 100644
--- a/sysoptions.h
+++ b/sysoptions.h
@@ -178,6 +178,10 @@
#define DROPBEAR_KEY_LINES /* ie we're using authorized_keys or known_hosts */
#endif
+/* Changing this is inadvisable, it appears to have problems
+ * with flushing compressed data */
+#define DROPBEAR_ZLIB_MEM_LEVEL 8
+
#if defined(ENABLE_SVR_PASSWORD_AUTH) && defined(ENABLE_SVR_PAM_AUTH)
#error "You can't turn on PASSWORD and PAM auth both at once. Fix it in options.h"
#endif