diff options
Diffstat (limited to 'dep/zlib/inflate.c')
| -rw-r--r-- | dep/zlib/inflate.c | 90 | 
1 files changed, 53 insertions, 37 deletions
diff --git a/dep/zlib/inflate.c b/dep/zlib/inflate.c index a8431abeacf..47418a1e1e1 100644 --- a/dep/zlib/inflate.c +++ b/dep/zlib/inflate.c @@ -1,5 +1,5 @@  /* inflate.c -- zlib decompression - * Copyright (C) 1995-2010 Mark Adler + * Copyright (C) 1995-2012 Mark Adler   * For conditions of distribution and use, see copyright notice in zlib.h   */ @@ -100,7 +100,7 @@ local int updatewindow OF((z_streamp strm, unsigned out));  local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,                                unsigned len)); -int ZEXPORT inflateReset(strm) +int ZEXPORT inflateResetKeep(strm)  z_streamp strm;  {      struct inflate_state FAR *state; @@ -109,15 +109,13 @@ z_streamp strm;      state = (struct inflate_state FAR *)strm->state;      strm->total_in = strm->total_out = state->total = 0;      strm->msg = Z_NULL; -    strm->adler = 1;        /* to support ill-conceived Java test suite */ +    if (state->wrap)        /* to support ill-conceived Java test suite */ +        strm->adler = state->wrap & 1;      state->mode = HEAD;      state->last = 0;      state->havedict = 0;      state->dmax = 32768U;      state->head = Z_NULL; -    state->wsize = 0; -    state->whave = 0; -    state->wnext = 0;      state->hold = 0;      state->bits = 0;      state->lencode = state->distcode = state->next = state->codes; @@ -127,6 +125,19 @@ z_streamp strm;      return Z_OK;  } +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ +    struct inflate_state FAR *state; + +    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; +    state = (struct inflate_state FAR *)strm->state; +    state->wsize = 0; +    state->whave = 0; +    state->wnext = 0; +    return inflateResetKeep(strm); +} +  int ZEXPORT inflateReset2(strm, windowBits)  z_streamp strm;  int windowBits; @@ -180,10 +191,19 @@ int stream_size;      if (strm == Z_NULL) return Z_STREAM_ERROR;      strm->msg = Z_NULL;                 /* in case we return an error */      if (strm->zalloc == (alloc_func)0) { +#ifdef Z_SOLO +        return Z_STREAM_ERROR; +#else          strm->zalloc = zcalloc;          strm->opaque = (voidpf)0; +#endif      } -    if (strm->zfree == (free_func)0) strm->zfree = zcfree; +    if (strm->zfree == (free_func)0) +#ifdef Z_SOLO +        return Z_STREAM_ERROR; +#else +        strm->zfree = zcfree; +#endif      state = (struct inflate_state FAR *)              ZALLOC(strm, 1, sizeof(struct inflate_state));      if (state == Z_NULL) return Z_MEM_ERROR; @@ -321,8 +341,8 @@ void makefixed()      low = 0;      for (;;) {          if ((low % 7) == 0) printf("\n        "); -        printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, -               state.lencode[low].val); +        printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op, +               state.lencode[low].bits, state.lencode[low].val);          if (++low == size) break;          putchar(',');      } @@ -499,11 +519,6 @@ unsigned out;          bits -= bits & 7; \      } while (0) -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ -    ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ -     (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) -  /*     inflate() uses a state machine to process as much input data and generate as     much output data as possible before returning.  The state machine is @@ -797,7 +812,7 @@ int flush;  #endif          case DICTID:              NEEDBITS(32); -            strm->adler = state->check = REVERSE(hold); +            strm->adler = state->check = ZSWAP32(hold);              INITBITS();              state->mode = DICT;          case DICT: @@ -925,7 +940,6 @@ int flush;                      PULLBYTE();                  }                  if (here.val < 16) { -                    NEEDBITS(here.bits);                      DROPBITS(here.bits);                      state->lens[state->have++] = here.val;                  } @@ -1170,7 +1184,7 @@ int flush;  #ifdef GUNZIP                       state->flags ? hold :  #endif -                     REVERSE(hold)) != state->check) { +                     ZSWAP32(hold)) != state->check) {                      strm->msg = (char *)"incorrect data check";                      state->mode = BAD;                      break; @@ -1214,7 +1228,8 @@ int flush;       */    inf_leave:      RESTORE(); -    if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) +    if (state->wsize || (out != strm->avail_out && state->mode < BAD && +            (state->mode < CHECK || flush != Z_FINISH)))          if (updatewindow(strm, out)) {              state->mode = MEM;              return Z_MEM_ERROR; @@ -1255,7 +1270,10 @@ const Bytef *dictionary;  uInt dictLength;  {      struct inflate_state FAR *state; -    unsigned long id; +    unsigned long dictid; +    unsigned char *next; +    unsigned avail; +    int ret;      /* check state */      if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; @@ -1263,29 +1281,27 @@ uInt dictLength;      if (state->wrap != 0 && state->mode != DICT)          return Z_STREAM_ERROR; -    /* check for correct dictionary id */ +    /* check for correct dictionary identifier */      if (state->mode == DICT) { -        id = adler32(0L, Z_NULL, 0); -        id = adler32(id, dictionary, dictLength); -        if (id != state->check) +        dictid = adler32(0L, Z_NULL, 0); +        dictid = adler32(dictid, dictionary, dictLength); +        if (dictid != state->check)              return Z_DATA_ERROR;      } -    /* copy dictionary to window */ -    if (updatewindow(strm, strm->avail_out)) { +    /* copy dictionary to window using updatewindow(), which will amend the +       existing dictionary if appropriate */ +    next = strm->next_out; +    avail = strm->avail_out; +    strm->next_out = (Bytef *)dictionary + dictLength; +    strm->avail_out = 0; +    ret = updatewindow(strm, dictLength); +    strm->avail_out = avail; +    strm->next_out = next; +    if (ret) {          state->mode = MEM;          return Z_MEM_ERROR;      } -    if (dictLength > state->wsize) { -        zmemcpy(state->window, dictionary + dictLength - state->wsize, -                state->wsize); -        state->whave = state->wsize; -    } -    else { -        zmemcpy(state->window + state->wsize - dictLength, dictionary, -                dictLength); -        state->whave = dictLength; -    }      state->havedict = 1;      Tracev((stderr, "inflate:   dictionary set\n"));      return Z_OK; @@ -1433,8 +1449,8 @@ z_streamp source;      }      /* copy state */ -    zmemcpy(dest, source, sizeof(z_stream)); -    zmemcpy(copy, state, sizeof(struct inflate_state)); +    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); +    zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));      if (state->lencode >= state->codes &&          state->lencode <= state->codes + ENOUGH - 1) {          copy->lencode = copy->codes + (state->lencode - state->codes);  | 
