Sebastian Kuschel reports that pfd_closing can be called for a socket
[u/mdw/putty] / sshzlib.c
index 373c779..05fa577 100644 (file)
--- a/sshzlib.c
+++ b/sshzlib.c
@@ -38,6 +38,7 @@
  */
 
 #include <stdlib.h>
+#include <string.h>
 #include <assert.h>
 
 #ifdef ZLIB_STANDALONE
@@ -224,6 +225,7 @@ static void lz77_compress(struct LZ77Context *ctx,
     }
     st->npending -= i;
 
+    defermatch.distance = 0; /* appease compiler */
     defermatch.len = 0;
     deferchr = '\0';
     while (len > 0) {
@@ -698,9 +700,9 @@ int zlib_compress_block(void *handle, unsigned char *block, int len,
 
            /*
             * Start a Deflate (RFC1951) uncompressed block. We
-            * transmit a zero bit (BFINAL=0), followed by a zero
-            * bit and a one bit (BTYPE=00). Of course these are in
-            * the wrong order (00 0).
+            * transmit a zero bit (BFINAL=0), followed by two more
+            * zero bits (BTYPE=00). Of course these are in the
+            * wrong order (00 0), not that it matters.
             */
            outbits(out, 0, 3);
 
@@ -1258,6 +1260,8 @@ int zlib_decompress_block(void *handle, unsigned char *block, int len,
                goto finished;
            nlen = dctx->bits & 0xFFFF;
            EATBITS(16);
+           if (dctx->uncomplen != (nlen ^ 0xFFFF))
+               goto decode_error;
            if (dctx->uncomplen == 0)
                dctx->state = OUTSIDEBLK;       /* block is empty */
            else
@@ -1368,6 +1372,7 @@ int main(int argc, char **argv)
 
 const struct ssh_compress ssh_zlib = {
     "zlib",
+    "zlib@openssh.com", /* delayed version */
     zlib_compress_init,
     zlib_compress_cleanup,
     zlib_compress_block,