diff --git a/src/modules/Gz/zlibmod.c b/src/modules/Gz/zlibmod.c
index 6b6104f76d24531e71cb4a2e6012881a6b8ff83d..3eb8c8fd751e057f76e3fb01a8327a7b7abe1fa9 100644
--- a/src/modules/Gz/zlibmod.c
+++ b/src/modules/Gz/zlibmod.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: zlibmod.c,v 1.23 1999/02/10 21:47:46 hubbe Exp $");
+RCSID("$Id: zlibmod.c,v 1.24 1999/06/08 12:35:45 mirar Exp $");
 
 #include "zlib_machine.h"
 
@@ -94,43 +94,32 @@ static int do_deflate(dynamic_buffer *buf,
 		      struct zipper *this,
 		      int flush)
 {
-  int fail=0;
-
-  THREADS_ALLOW();
-  mt_lock(& this->lock);
-  THREADS_DISALLOW();
-  if(!this->gz.state)
-  {
-    fail=Z_STREAM_ERROR;
-  }else{
-    do
-    {
-      char *loc;
-      int ret;
-      loc=low_make_buf_space(BUF,buf);
-      this->gz.next_out=(Bytef *)loc;
-      this->gz.avail_out=BUF;
-      while (1) {
-        THREADS_ALLOW();
-        ret=deflate(& this->gz, flush);
-        THREADS_DISALLOW();
-	if ((ret != Z_BUF_ERROR) || (this->gz.avail_out > MAX_BUF)) {
-	  break;
-	}
-	low_make_buf_space(BUF, buf);
-	this->gz.avail_out += BUF;
-      } 
-      low_make_buf_space(-this->gz.avail_out,buf);
-      if(ret != Z_OK)
+   int ret=0;
+
+   THREADS_ALLOW();
+   mt_lock(& this->lock);
+   THREADS_DISALLOW();
+   if(!this->gz.state)
+      ret=Z_STREAM_ERROR;
+   else
+      do
       {
-	fail=ret;
-	break;
+	 this->gz.next_out=low_make_buf_space(
+	    /* recommended by the zlib people */
+	    (this->gz.avail_out =
+	     this->gz.avail_in+this->gz.avail_in/1000+42),
+	    buf);
+
+	 THREADS_ALLOW();
+	 ret=deflate(& this->gz, flush);
+	 THREADS_DISALLOW();
+
+	 /* we don't care about Z_BUF_ERROR here; it won't happen. */
       }
-    } while(!this->gz.avail_out || flush==Z_FINISH || this->gz.avail_in);
-  }
+      while (ret==Z_OK && flush==Z_FINISH);
 
-  mt_unlock(& this->lock);
-  return fail;
+   mt_unlock(& this->lock);
+   return ret;
 }
 
 static void gz_deflate(INT32 args)