--- src/comp.c.orig	2010-08-31 15:55:38.000000000 -0700
+++ src/comp.c	2010-08-31 16:00:12.000000000 -0700
@@ -167,7 +167,7 @@
     /* A short-term alloc of a full data chunk is better than a series of
        reallocs */
     char *out;
-    int out_maxlen = compress ? (src_len + 4) : (2 * src_len);
+    int out_maxlen = compress ? (src_len + 4) : (8 * src_len);
     int limiter = 0;
 
     /* If strm is null, then we have not yet been initialized. */
@@ -208,6 +208,8 @@
         }
         if (status != Z_OK) {
             LIBSSH2_FREE(session, out);
+            _libssh2_debug(session, LIBSSH2_TRACE_TRANS,
+                           "unhandled zlib error %d", status);
             return _libssh2_error(session, LIBSSH2_ERROR_ZLIB,
                                   "compress/decompression failure");
         }
@@ -216,7 +218,7 @@
             char *newout;
 
             out_maxlen +=
-                compress ? (strm->avail_in + 4) : (2 * strm->avail_in);
+                compress ? (strm->avail_in + 4) : (8 * strm->avail_in);
 
             if ((out_maxlen > (int) payload_limit) && !compress && limiter++) {
                 LIBSSH2_FREE(session, out);
@@ -234,14 +236,14 @@
             out = newout;
             strm->next_out = (unsigned char *) out + out_ofs;
             strm->avail_out +=
-                compress ? (strm->avail_in + 4) : (2 * strm->avail_in);
+                compress ? (strm->avail_in + 4) : (8 * strm->avail_in);
         } else
             while (!strm->avail_out) {
                 /* Done with input, might be a byte or two in internal buffer
                  * during compress.  Or potentially many bytes if it's a
                  * decompress
                  */
-                int grow_size = compress ? 8 : 1024;
+                int grow_size = compress ? 8 : 2048;
                 char *newout;
 
                 if (out_maxlen >= (int) payload_limit) {
@@ -276,6 +278,8 @@
                 }
                 if (status != Z_OK) {
                     LIBSSH2_FREE(session, out);
+                    _libssh2_debug(session, LIBSSH2_TRACE_TRANS,
+                                   "unhandled zlib error %d", status);
                     return _libssh2_error(session, LIBSSH2_ERROR_ZLIB,
                                           "compress/decompression failure");
                 }
