diff options
author | Markus Friedl <markus@cvs.openbsd.org> | 2001-04-05 10:39:04 +0000 |
---|---|---|
committer | Markus Friedl <markus@cvs.openbsd.org> | 2001-04-05 10:39:04 +0000 |
commit | b978709b00b76c7a4a33ea2f757f4eb24a056f75 (patch) | |
tree | b3a0acb7b7cef159dcb6ac4338a0939c12f4ec58 | |
parent | d70969a68d04720ef733a275ee897e5f46493bfa (diff) |
reset compress state per direction when rekeying.
-rw-r--r-- | usr.bin/ssh/compress.c | 24 | ||||
-rw-r--r-- | usr.bin/ssh/compress.h | 5 | ||||
-rw-r--r-- | usr.bin/ssh/packet.c | 29 |
3 files changed, 43 insertions, 15 deletions
diff --git a/usr.bin/ssh/compress.c b/usr.bin/ssh/compress.c index e8539baf006..3e41b3d8218 100644 --- a/usr.bin/ssh/compress.c +++ b/usr.bin/ssh/compress.c @@ -12,7 +12,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: compress.c,v 1.13 2001/02/08 19:30:51 itojun Exp $"); +RCSID("$OpenBSD: compress.c,v 1.14 2001/04/05 10:39:01 markus Exp $"); #include "log.h" #include "buffer.h" @@ -21,6 +21,8 @@ RCSID("$OpenBSD: compress.c,v 1.13 2001/02/08 19:30:51 itojun Exp $"); static z_stream incoming_stream; static z_stream outgoing_stream; +static int compress_init_send_called = 0; +static int compress_init_recv_called = 0; /* * Initializes compression; level is compression level from 1 to 9 @@ -28,14 +30,24 @@ static z_stream outgoing_stream; */ void -buffer_compress_init(int level) +buffer_compress_init_send(int level) { + if (compress_init_send_called == 1) + deflateEnd(&incoming_stream); + compress_init_send_called = 1; debug("Enabling compression at level %d.", level); if (level < 1 || level > 9) fatal("Bad compression level %d.", level); - inflateInit(&incoming_stream); deflateInit(&outgoing_stream, level); } +void +buffer_compress_init_recv(void) +{ + if (compress_init_recv_called == 1) + inflateEnd(&incoming_stream); + compress_init_recv_called = 1; + inflateInit(&incoming_stream); +} /* Frees any data structures allocated for compression. */ @@ -50,8 +62,10 @@ buffer_compress_uninit(void) incoming_stream.total_out, incoming_stream.total_in, incoming_stream.total_out == 0 ? 0.0 : (double) incoming_stream.total_in / incoming_stream.total_out); - inflateEnd(&incoming_stream); - deflateEnd(&outgoing_stream); + if (compress_init_recv_called == 1) + inflateEnd(&incoming_stream); + if (compress_init_send_called == 1) + deflateEnd(&outgoing_stream); } /* diff --git a/usr.bin/ssh/compress.h b/usr.bin/ssh/compress.h index 87d592fe907..f90932a6faf 100644 --- a/usr.bin/ssh/compress.h +++ b/usr.bin/ssh/compress.h @@ -11,7 +11,7 @@ * called by a name other than "ssh" or "Secure Shell". */ -/* RCSID("$OpenBSD: compress.h,v 1.7 2000/12/20 19:37:22 markus Exp $"); */ +/* RCSID("$OpenBSD: compress.h,v 1.8 2001/04/05 10:39:02 markus Exp $"); */ #ifndef COMPRESS_H #define COMPRESS_H @@ -20,7 +20,8 @@ * Initializes compression; level is compression level from 1 to 9 (as in * gzip). */ -void buffer_compress_init(int level); +void buffer_compress_init_send(int level); +void buffer_compress_init_recv(void); /* Frees any data structures allocated by buffer_compress_init. */ void buffer_compress_uninit(void); diff --git a/usr.bin/ssh/packet.c b/usr.bin/ssh/packet.c index 229cd72b8f7..bd0aa5766f6 100644 --- a/usr.bin/ssh/packet.c +++ b/usr.bin/ssh/packet.c @@ -37,7 +37,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: packet.c,v 1.59 2001/04/04 23:09:18 markus Exp $"); +RCSID("$OpenBSD: packet.c,v 1.60 2001/04/05 10:39:03 markus Exp $"); #include "xmalloc.h" #include "buffer.h" @@ -104,6 +104,7 @@ static Buffer incoming_packet; /* Scratch buffer for packet compression/decompression. */ static Buffer compression_buffer; +static int compression_buffer_ready = 0; /* Flag indicating whether packet compression/decompression is enabled. */ static int packet_compression = 0; @@ -249,7 +250,7 @@ packet_close() buffer_free(&output); buffer_free(&outgoing_packet); buffer_free(&incoming_packet); - if (packet_compression) { + if (compression_buffer_ready) { buffer_free(&compression_buffer); buffer_compress_uninit(); } @@ -277,15 +278,24 @@ packet_get_protocol_flags() * Level is compression level 1 (fastest) - 9 (slow, best) as in gzip. */ -/*** XXXXX todo: kex means re-init */ +void +packet_init_compression() +{ + if (compression_buffer_ready == 1) + return; + compression_buffer_ready = 1; + buffer_init(&compression_buffer); +} + void packet_start_compression(int level) { - if (packet_compression) + if (packet_compression && !use_ssh2_packet_format) fatal("Compression already enabled."); packet_compression = 1; - buffer_init(&compression_buffer); - buffer_compress_init(level); + packet_init_compression(); + buffer_compress_init_send(level); + buffer_compress_init_recv(); } /* @@ -542,9 +552,12 @@ set_newkeys(int mode) memset(enc->iv, 0, enc->cipher->block_size); memset(enc->key, 0, enc->cipher->key_len); if (comp->type != 0 && comp->enabled == 0) { + packet_init_compression(); + if (mode == MODE_OUT) + buffer_compress_init_send(6); + else + buffer_compress_init_recv(); comp->enabled = 1; - if (! packet_compression) - packet_start_compression(6); } } |