Keresztfalvi Gabor <[EMAIL PROTECTED]> writes:
> Now it doesn't segfault... but:
> do_zlib: deflate() or inflate() failed: buffer error
> lshd: compress.c:54: do_packet_deflate: Assertion `packet' failed.
> This possibly means (from zlib.h):
> deflate() returns <snip> Z_BUF_ERROR if no progress is possible (for
> example avail_in or avail_out was zero).
I got this as well. Improved patch:
diff -u -a -r1.21 zlib.c
--- zlib.c 1999/11/16 22:13:49 1.21
+++ zlib.c 2000/01/09 15:42:25
@@ -25,10 +25,13 @@
#include "compress.h"
#include "format.h"
+#include "ssh.h"
#include "string_buffer.h"
#include "werror.h"
#include "xalloc.h"
+#if WITH_ZLIB
+
#if HAVE_ZLIB_H
#include <zlib.h>
#else
@@ -63,8 +66,6 @@
*/
-#if WITH_ZLIB
-
/* zlib memory functions */
static void *zlib_alloc(void *opaque UNUSED, unsigned int items, unsigned int size)
{
@@ -207,16 +208,33 @@
res->z.zalloc = zlib_alloc;
res->z.zfree = zlib_free;
+
switch (mode)
{
case COMPRESS_DEFLATE:
res->z.opaque = deflateEnd;
+ res->f = deflate;
res->super.codec = do_zlib;
+
+ /* Maximum expansion is 0.1% + 12 bytes. We use 1% + 12, to be conservative.
+ *
+ * FIXME: However, these figures are documented for the
+ * entire stream, does they really apply to all segments,
+ * separated by Z_SYNC_FLUSH ? */
+
+ res->max = SSH_MAX_PACKET + SSH_MAX_PACKET / 100 + 12;
+ res->rate = RATE_UNIT;
+
deflateInit(&res->z, closure->level);
break;
case COMPRESS_INFLATE:
res->z.opaque = inflateEnd;
+ res->f = inflate;
res->super.codec = do_zlib;
+
+ res->max = SSH_MAX_PACKET;
+ res->rate = 2 * RATE_UNIT;
+
inflateInit(&res->z);
break;
}
With this patch, I get a little further, now
lsh -v --trace -z -p 4711 localhost
dies a little later. With a different error:
do_zlib: deflate() or inflate() failed: invalid stored block lengths
compress.c:76: do_packet_inflate: Raising exception Inflating
compressed data failed. (type 4096), using handler installed by connection.c:218:
make_ssh_connection
connection.c:184: do_exc_protocol_handler: Raising exception Finish
i/o (type 65538), using handler installed by connection_commands.c:369: do_handshake
Connection died, for reason 1.
/Niels