b613cbd75085384df2ec87fcf2475f7d154f55ff
   1/*
   2 * zlib wrappers to make sure we don't silently miss errors
   3 * at init time.
   4 */
   5#include "cache.h"
   6
   7static const char *zerr_to_string(int status)
   8{
   9        switch (status) {
  10        case Z_MEM_ERROR:
  11                return "out of memory";
  12        case Z_VERSION_ERROR:
  13                return "wrong version";
  14        case Z_NEED_DICT:
  15                return "needs dictionary";
  16        case Z_DATA_ERROR:
  17                return "data stream error";
  18        case Z_STREAM_ERROR:
  19                return "stream consistency error";
  20        default:
  21                return "unknown error";
  22        }
  23}
  24
  25void git_inflate_init(z_streamp strm)
  26{
  27        int status = inflateInit(strm);
  28
  29        if (status == Z_OK)
  30                return;
  31        die("inflateInit: %s (%s)", zerr_to_string(status),
  32            strm->msg ? strm->msg : "no message");
  33}
  34
  35void git_inflate_init_gzip_only(z_streamp strm)
  36{
  37        /*
  38         * Use default 15 bits, +16 is to accept only gzip and to
  39         * yield Z_DATA_ERROR when fed zlib format.
  40         */
  41        const int windowBits = 15 + 16;
  42        int status = inflateInit2(strm, windowBits);
  43
  44        if (status == Z_OK)
  45                return;
  46        die("inflateInit2: %s (%s)", zerr_to_string(status),
  47            strm->msg ? strm->msg : "no message");
  48}
  49
  50void git_inflate_end(z_streamp strm)
  51{
  52        int status = inflateEnd(strm);
  53
  54        if (status == Z_OK)
  55                return;
  56        error("inflateEnd: %s (%s)", zerr_to_string(status),
  57              strm->msg ? strm->msg : "no message");
  58}
  59
  60int git_inflate(z_streamp strm, int flush)
  61{
  62        int status = inflate(strm, flush);
  63
  64        switch (status) {
  65        /* Z_BUF_ERROR: normal, needs more space in the output buffer */
  66        case Z_BUF_ERROR:
  67        case Z_OK:
  68        case Z_STREAM_END:
  69                return status;
  70
  71        case Z_MEM_ERROR:
  72                die("inflate: out of memory");
  73        default:
  74                break;
  75        }
  76        error("inflate: %s (%s)", zerr_to_string(status),
  77              strm->msg ? strm->msg : "no message");
  78        return status;
  79}