Blob Blame Raw
--- libinterp/dldfcn/gzip.cc.orig	2016-11-13 08:16:10.000000000 -0700
+++ libinterp/dldfcn/gzip.cc	2016-12-03 07:30:58.000000000 -0700
@@ -348,14 +348,18 @@
         unsigned char buf_in[buf_len];
         unsigned char buf_out[buf_len];
 
-        while ((strm->avail_in = std::fread (buf_in, sizeof (buf_in[0]),
-                                             buf_len, source.fp)) != 0)
+	int flush;
+
+        do
           {
+            strm->avail_in = std::fread (buf_in, sizeof (buf_in[0]),
+					 buf_len, source.fp);
+
             if (std::ferror (source.fp))
               throw std::runtime_error ("failed to read source file");
 
             strm->next_in = buf_in;
-            const int flush = std::feof (source.fp) ? Z_FINISH : Z_NO_FLUSH;
+            flush = std::feof (source.fp) ? Z_FINISH : Z_NO_FLUSH;
 
             // If deflate returns Z_OK and with zero avail_out, it must be
             // called again after making room in the output buffer because
@@ -376,8 +380,11 @@
             while (strm->avail_out == 0);
 
             if (strm->avail_in != 0)
-              throw std::runtime_error ("failed to wrote file");
-          }
+              throw std::runtime_error ("failed to write file");
+          } while (flush != Z_FINISH);
+
+          if (status != Z_STREAM_END)
+            throw std::runtime_error ("failed to write file");
       }
 
       void