zlib: wrap inflateInit2 used to accept only for gzip format
[gitweb.git] / zlib.c
diff --git a/zlib.c b/zlib.c
index c4d58da4e9050c6330ff145914cc379f0600f703..b613cbd75085384df2ec87fcf2475f7d154f55ff 100644 (file)
--- a/zlib.c
+++ b/zlib.c
@@ -4,58 +4,76 @@
  */
 #include "cache.h"
 
-void git_inflate_init(z_streamp strm)
+static const char *zerr_to_string(int status)
 {
-       const char *err;
-
-       switch (inflateInit(strm)) {
-       case Z_OK:
-               return;
-
+       switch (status) {
        case Z_MEM_ERROR:
-               err = "out of memory";
-               break;
+               return "out of memory";
        case Z_VERSION_ERROR:
-               err = "wrong version";
-               break;
+               return "wrong version";
+       case Z_NEED_DICT:
+               return "needs dictionary";
+       case Z_DATA_ERROR:
+               return "data stream error";
+       case Z_STREAM_ERROR:
+               return "stream consistency error";
        default:
-               err = "error";
+               return "unknown error";
        }
-       die("inflateInit: %s (%s)", err, strm->msg ? strm->msg : "no message");
 }
 
-void git_inflate_end(z_streamp strm)
+void git_inflate_init(z_streamp strm)
 {
-       if (inflateEnd(strm) != Z_OK)
-               error("inflateEnd: %s", strm->msg ? strm->msg : "failed");
+       int status = inflateInit(strm);
+
+       if (status == Z_OK)
+               return;
+       die("inflateInit: %s (%s)", zerr_to_string(status),
+           strm->msg ? strm->msg : "no message");
 }
 
-int git_inflate(z_streamp strm, int flush)
+void git_inflate_init_gzip_only(z_streamp strm)
 {
-       int ret = inflate(strm, flush);
-       const char *err;
+       /*
+        * Use default 15 bits, +16 is to accept only gzip and to
+        * yield Z_DATA_ERROR when fed zlib format.
+        */
+       const int windowBits = 15 + 16;
+       int status = inflateInit2(strm, windowBits);
 
-       switch (ret) {
-       /* Out of memory is fatal. */
-       case Z_MEM_ERROR:
-               die("inflate: out of memory");
+       if (status == Z_OK)
+               return;
+       die("inflateInit2: %s (%s)", zerr_to_string(status),
+           strm->msg ? strm->msg : "no message");
+}
 
-       /* Data corruption errors: we may want to recover from them (fsck) */
-       case Z_NEED_DICT:
-               err = "needs dictionary"; break;
-       case Z_DATA_ERROR:
-               err = "data stream error"; break;
-       case Z_STREAM_ERROR:
-               err = "stream consistency error"; break;
-       default:
-               err = "unknown error"; break;
+void git_inflate_end(z_streamp strm)
+{
+       int status = inflateEnd(strm);
+
+       if (status == Z_OK)
+               return;
+       error("inflateEnd: %s (%s)", zerr_to_string(status),
+             strm->msg ? strm->msg : "no message");
+}
 
+int git_inflate(z_streamp strm, int flush)
+{
+       int status = inflate(strm, flush);
+
+       switch (status) {
        /* Z_BUF_ERROR: normal, needs more space in the output buffer */
        case Z_BUF_ERROR:
        case Z_OK:
        case Z_STREAM_END:
-               return ret;
+               return status;
+
+       case Z_MEM_ERROR:
+               die("inflate: out of memory");
+       default:
+               break;
        }
-       error("inflate: %s (%s)", err, strm->msg ? strm->msg : "no message");
-       return ret;
+       error("inflate: %s (%s)", zerr_to_string(status),
+             strm->msg ? strm->msg : "no message");
+       return status;
 }