Rizin
unix-like reverse engineering framework and cli tools
inflate.c File Reference
#include "zutil.h"
#include "inftrees.h"
#include "inflate.h"
#include "inffast.h"
#include "inffixed.h"

Go to the source code of this file.

Macros

#define UPDATE_CHECK(check, buf, len)    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
 
#define CRC2(check, word)
 
#define CRC4(check, word)
 
#define LOAD()
 
#define RESTORE()
 
#define INITBITS()
 
#define PULLBYTE()
 
#define NEEDBITS(n)
 
#define BITS(n)    ((unsigned)hold & ((1U << (n)) - 1))
 
#define DROPBITS(n)
 
#define BYTEBITS()
 

Functions

int inflateStateCheck OF ((z_streamp strm))
 
void fixedtables OF ((struct inflate_state FAR *state))
 
int updatewindow OF ((z_streamp strm, const unsigned char FAR *end, unsigned copy))
 
unsigned syncsearch OF ((unsigned FAR *have, const unsigned char FAR *buf, unsigned len))
 
int inflateStateCheck (z_streamp strm)
 
int ZEXPORT inflateResetKeep (z_streamp strm)
 
int ZEXPORT inflateReset (z_streamp strm)
 
int ZEXPORT inflateReset2 (z_streamp strm, int windowBits)
 
int ZEXPORT inflateInit2_ (z_streamp strm, int windowBits, const char *version, int stream_size)
 
int ZEXPORT inflateInit_ (z_streamp strm, const char *version, int stream_size)
 
int ZEXPORT inflatePrime (z_streamp strm, int bits, int value)
 
void fixedtables (struct inflate_state FAR *state)
 
int updatewindow (z_streamp strm, const Bytef *end, unsigned copy)
 
int ZEXPORT inflate (z_streamp strm, int flush)
 
int ZEXPORT inflateEnd (z_streamp strm)
 
int ZEXPORT inflateGetDictionary (z_streamp strm, Bytef *dictionary, uInt *dictLength)
 
int ZEXPORT inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength)
 
int ZEXPORT inflateGetHeader (z_streamp strm, gz_headerp head)
 
unsigned syncsearch (unsigned FAR *have, const unsigned char FAR *buf, unsigned len)
 
int ZEXPORT inflateSync (z_streamp strm)
 
int ZEXPORT inflateSyncPoint (z_streamp strm)
 
int ZEXPORT inflateCopy (z_streamp dest, z_streamp source)
 
int ZEXPORT inflateUndermine (z_streamp strm, int subvert)
 
int ZEXPORT inflateValidate (z_streamp strm, int check)
 
long ZEXPORT inflateMark (z_streamp strm)
 
unsigned long ZEXPORT inflateCodesUsed (z_streamp strm)
 

Macro Definition Documentation

◆ BITS

#define BITS (   n)     ((unsigned)hold & ((1U << (n)) - 1))

Definition at line 524 of file inflate.c.

◆ BYTEBITS

#define BYTEBITS ( )
Value:
do { \
hold >>= bits & 7; \
bits -= bits & 7; \
} while (0)
int bits(struct state *s, int need)
Definition: blast.c:72

Definition at line 535 of file inflate.c.

◆ CRC2

#define CRC2 (   check,
  word 
)
Value:
do { \
hbuf[0] = (unsigned char)(word); \
hbuf[1] = (unsigned char)((word) >> 8); \
check = crc32(check, hbuf, 2); \
} while (0)
lzma_check check
Definition: container.h:292
unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, uInt len)
Definition: crc32.c:1063

Definition at line 459 of file inflate.c.

◆ CRC4

#define CRC4 (   check,
  word 
)
Value:
do { \
hbuf[0] = (unsigned char)(word); \
hbuf[1] = (unsigned char)((word) >> 8); \
hbuf[2] = (unsigned char)((word) >> 16); \
hbuf[3] = (unsigned char)((word) >> 24); \
check = crc32(check, hbuf, 4); \
} while (0)

Definition at line 466 of file inflate.c.

◆ DROPBITS

#define DROPBITS (   n)
Value:
do { \
hold >>= (n); \
bits -= (unsigned)(n); \
} while (0)
static void struct sockaddr socklen_t static fromlen static backlog static fork char char char static envp int struct rusage static rusage struct utsname static buf struct sembuf unsigned
Definition: sflib.h:97
int n
Definition: mipsasm.c:19

Definition at line 528 of file inflate.c.

◆ INITBITS

#define INITBITS ( )
Value:
do { \
hold = 0; \
bits = 0; \
} while (0)

Definition at line 499 of file inflate.c.

◆ LOAD

#define LOAD ( )
Value:
do { \
put = strm->next_out; \
left = strm->avail_out; \
next = strm->next_in; \
have = strm->avail_in; \
hold = state->hold; \
bits = state->bits; \
} while (0)
static lzma_stream strm
Definition: full_flush.c:20
uint8_t * next_out
Definition: base.h:490
size_t avail_out
Definition: base.h:491
const uint8_t * next_in
Definition: base.h:486
size_t avail_in
Definition: base.h:487
Definition: dis.h:43

Definition at line 477 of file inflate.c.

◆ NEEDBITS

#define NEEDBITS (   n)
Value:
do { \
while (bits < (unsigned)(n)) \
PULLBYTE(); \
} while (0)

Definition at line 517 of file inflate.c.

◆ PULLBYTE

#define PULLBYTE ( )
Value:
do { \
if (have == 0) goto inf_leave; \
have--; \
hold += (unsigned long)(*next++) << bits; \
bits += 8; \
} while (0)
while(len< limit &&buf1[len]==buf2[len])++len

Definition at line 507 of file inflate.c.

◆ RESTORE

#define RESTORE ( )
Value:
do { \
strm->next_out = put; \
strm->avail_out = left; \
strm->next_in = next; \
strm->avail_in = have; \
state->hold = hold; \
state->bits = bits; \
} while (0)

Definition at line 488 of file inflate.c.

◆ UPDATE_CHECK

#define UPDATE_CHECK (   check,
  buf,
  len 
)     (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))

Definition at line 451 of file inflate.c.

Function Documentation

◆ fixedtables()

void fixedtables ( struct inflate_state FAR state)

Definition at line 279 of file inflate.c.

281 {
282 #ifdef BUILDFIXED
283  static int virgin = 1;
284  static code *lenfix, *distfix;
285  static code fixed[544];
286 
287  /* build fixed huffman tables if first call (may not be thread safe) */
288  if (virgin) {
289  unsigned sym, bits;
290  static code *next;
291 
292  /* literal/length table */
293  sym = 0;
294  while (sym < 144) state->lens[sym++] = 8;
295  while (sym < 256) state->lens[sym++] = 9;
296  while (sym < 280) state->lens[sym++] = 7;
297  while (sym < 288) state->lens[sym++] = 8;
298  next = fixed;
299  lenfix = next;
300  bits = 9;
301  inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
302 
303  /* distance table */
304  sym = 0;
305  while (sym < 32) state->lens[sym++] = 5;
306  distfix = next;
307  bits = 5;
308  inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
309 
310  /* do this just once */
311  virgin = 0;
312  }
313 #else /* !BUILDFIXED */
314 # include "inffixed.h"
315 #endif /* BUILDFIXED */
316  state->lencode = lenfix;
317  state->lenbits = 9;
318  state->distcode = distfix;
319  state->distbits = 5;
320 }
static const code distfix[32]
Definition: inffix9.h:99
static const code lenfix[512]
Definition: inffix9.h:10
@ LENS
Definition: inftree9.h:55
@ DISTS
Definition: inftree9.h:56
int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, unsigned codes, code FAR *FAR *table, unsigned FAR *bits, unsigned short FAR *work)
Definition: inftrees.c:32
int fixed(struct state *s)
Definition: puff.c:536
Definition: inftree9.h:24

References bits(), distfix, DISTS, fixed(), inflate_table(), lenfix, LENS, and inflate_state::next.

Referenced by inflate().

◆ inflate()

int ZEXPORT inflate ( z_streamp  strm,
int  flush 
)

Definition at line 623 of file inflate.c.

626 {
627  struct inflate_state FAR *state;
628  z_const unsigned char FAR *next; /* next input */
629  unsigned char FAR *put; /* next output */
630  unsigned have, left; /* available input and output */
631  unsigned long hold; /* bit buffer */
632  unsigned bits; /* bits in bit buffer */
633  unsigned in, out; /* save starting available input and output */
634  unsigned copy; /* number of stored or match bytes to copy */
635  unsigned char FAR *from; /* where to copy match bytes from */
636  code here; /* current decoding table entry */
637  code last; /* parent table entry */
638  unsigned len; /* length to copy for repeats, bits to drop */
639  int ret; /* return code */
640 #ifdef GUNZIP
641  unsigned char hbuf[4]; /* buffer for gzip header crc calculation */
642 #endif
643  static const unsigned short order[19] = /* permutation of code lengths */
644  {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
645 
646  if (inflateStateCheck(strm) || strm->next_out == Z_NULL ||
647  (strm->next_in == Z_NULL && strm->avail_in != 0))
648  return Z_STREAM_ERROR;
649 
650  state = (struct inflate_state FAR *)strm->state;
651  if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
652  LOAD();
653  in = have;
654  out = left;
655  ret = Z_OK;
656  for (;;)
657  switch (state->mode) {
658  case HEAD:
659  if (state->wrap == 0) {
660  state->mode = TYPEDO;
661  break;
662  }
663  NEEDBITS(16);
664 #ifdef GUNZIP
665  if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
666  if (state->wbits == 0)
667  state->wbits = 15;
668  state->check = crc32(0L, Z_NULL, 0);
669  CRC2(state->check, hold);
670  INITBITS();
671  state->mode = FLAGS;
672  break;
673  }
674  if (state->head != Z_NULL)
675  state->head->done = -1;
676  if (!(state->wrap & 1) || /* check if zlib header allowed */
677 #else
678  if (
679 #endif
680  ((BITS(8) << 8) + (hold >> 8)) % 31) {
681  strm->msg = (char *)"incorrect header check";
682  state->mode = BAD;
683  break;
684  }
685  if (BITS(4) != Z_DEFLATED) {
686  strm->msg = (char *)"unknown compression method";
687  state->mode = BAD;
688  break;
689  }
690  DROPBITS(4);
691  len = BITS(4) + 8;
692  if (state->wbits == 0)
693  state->wbits = len;
694  if (len > 15 || len > state->wbits) {
695  strm->msg = (char *)"invalid window size";
696  state->mode = BAD;
697  break;
698  }
699  state->dmax = 1U << len;
700  state->flags = 0; /* indicate zlib header */
701  Tracev((stderr, "inflate: zlib header ok\n"));
702  strm->adler = state->check = adler32(0L, Z_NULL, 0);
703  state->mode = hold & 0x200 ? DICTID : TYPE;
704  INITBITS();
705  break;
706 #ifdef GUNZIP
707  case FLAGS:
708  NEEDBITS(16);
709  state->flags = (int)(hold);
710  if ((state->flags & 0xff) != Z_DEFLATED) {
711  strm->msg = (char *)"unknown compression method";
712  state->mode = BAD;
713  break;
714  }
715  if (state->flags & 0xe000) {
716  strm->msg = (char *)"unknown header flags set";
717  state->mode = BAD;
718  break;
719  }
720  if (state->head != Z_NULL)
721  state->head->text = (int)((hold >> 8) & 1);
722  if ((state->flags & 0x0200) && (state->wrap & 4))
723  CRC2(state->check, hold);
724  INITBITS();
725  state->mode = TIME;
726  /* fallthrough */
727  case TIME:
728  NEEDBITS(32);
729  if (state->head != Z_NULL)
730  state->head->time = hold;
731  if ((state->flags & 0x0200) && (state->wrap & 4))
732  CRC4(state->check, hold);
733  INITBITS();
734  state->mode = OS;
735  /* fallthrough */
736  case OS:
737  NEEDBITS(16);
738  if (state->head != Z_NULL) {
739  state->head->xflags = (int)(hold & 0xff);
740  state->head->os = (int)(hold >> 8);
741  }
742  if ((state->flags & 0x0200) && (state->wrap & 4))
743  CRC2(state->check, hold);
744  INITBITS();
745  state->mode = EXLEN;
746  /* fallthrough */
747  case EXLEN:
748  if (state->flags & 0x0400) {
749  NEEDBITS(16);
750  state->length = (unsigned)(hold);
751  if (state->head != Z_NULL)
752  state->head->extra_len = (unsigned)hold;
753  if ((state->flags & 0x0200) && (state->wrap & 4))
754  CRC2(state->check, hold);
755  INITBITS();
756  }
757  else if (state->head != Z_NULL)
758  state->head->extra = Z_NULL;
759  state->mode = EXTRA;
760  /* fallthrough */
761  case EXTRA:
762  if (state->flags & 0x0400) {
763  copy = state->length;
764  if (copy > have) copy = have;
765  if (copy) {
766  if (state->head != Z_NULL &&
767  state->head->extra != Z_NULL) {
768  len = state->head->extra_len - state->length;
769  zmemcpy(state->head->extra + len, next,
770  len + copy > state->head->extra_max ?
771  state->head->extra_max - len : copy);
772  }
773  if ((state->flags & 0x0200) && (state->wrap & 4))
774  state->check = crc32(state->check, next, copy);
775  have -= copy;
776  next += copy;
777  state->length -= copy;
778  }
779  if (state->length) goto inf_leave;
780  }
781  state->length = 0;
782  state->mode = NAME;
783  /* fallthrough */
784  case NAME:
785  if (state->flags & 0x0800) {
786  if (have == 0) goto inf_leave;
787  copy = 0;
788  do {
789  len = (unsigned)(next[copy++]);
790  if (state->head != Z_NULL &&
791  state->head->name != Z_NULL &&
792  state->length < state->head->name_max)
793  state->head->name[state->length++] = (Bytef)len;
794  } while (len && copy < have);
795  if ((state->flags & 0x0200) && (state->wrap & 4))
796  state->check = crc32(state->check, next, copy);
797  have -= copy;
798  next += copy;
799  if (len) goto inf_leave;
800  }
801  else if (state->head != Z_NULL)
802  state->head->name = Z_NULL;
803  state->length = 0;
804  state->mode = COMMENT;
805  /* fallthrough */
806  case COMMENT:
807  if (state->flags & 0x1000) {
808  if (have == 0) goto inf_leave;
809  copy = 0;
810  do {
811  len = (unsigned)(next[copy++]);
812  if (state->head != Z_NULL &&
813  state->head->comment != Z_NULL &&
814  state->length < state->head->comm_max)
815  state->head->comment[state->length++] = (Bytef)len;
816  } while (len && copy < have);
817  if ((state->flags & 0x0200) && (state->wrap & 4))
818  state->check = crc32(state->check, next, copy);
819  have -= copy;
820  next += copy;
821  if (len) goto inf_leave;
822  }
823  else if (state->head != Z_NULL)
824  state->head->comment = Z_NULL;
825  state->mode = HCRC;
826  /* fallthrough */
827  case HCRC:
828  if (state->flags & 0x0200) {
829  NEEDBITS(16);
830  if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
831  strm->msg = (char *)"header crc mismatch";
832  state->mode = BAD;
833  break;
834  }
835  INITBITS();
836  }
837  if (state->head != Z_NULL) {
838  state->head->hcrc = (int)((state->flags >> 9) & 1);
839  state->head->done = 1;
840  }
841  strm->adler = state->check = crc32(0L, Z_NULL, 0);
842  state->mode = TYPE;
843  break;
844 #endif
845  case DICTID:
846  NEEDBITS(32);
847  strm->adler = state->check = ZSWAP32(hold);
848  INITBITS();
849  state->mode = DICT;
850  /* fallthrough */
851  case DICT:
852  if (state->havedict == 0) {
853  RESTORE();
854  return Z_NEED_DICT;
855  }
856  strm->adler = state->check = adler32(0L, Z_NULL, 0);
857  state->mode = TYPE;
858  /* fallthrough */
859  case TYPE:
860  if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
861  /* fallthrough */
862  case TYPEDO:
863  if (state->last) {
864  BYTEBITS();
865  state->mode = CHECK;
866  break;
867  }
868  NEEDBITS(3);
869  state->last = BITS(1);
870  DROPBITS(1);
871  switch (BITS(2)) {
872  case 0: /* stored block */
873  Tracev((stderr, "inflate: stored block%s\n",
874  state->last ? " (last)" : ""));
875  state->mode = STORED;
876  break;
877  case 1: /* fixed block */
879  Tracev((stderr, "inflate: fixed codes block%s\n",
880  state->last ? " (last)" : ""));
881  state->mode = LEN_; /* decode codes */
882  if (flush == Z_TREES) {
883  DROPBITS(2);
884  goto inf_leave;
885  }
886  break;
887  case 2: /* dynamic block */
888  Tracev((stderr, "inflate: dynamic codes block%s\n",
889  state->last ? " (last)" : ""));
890  state->mode = TABLE;
891  break;
892  case 3:
893  strm->msg = (char *)"invalid block type";
894  state->mode = BAD;
895  }
896  DROPBITS(2);
897  break;
898  case STORED:
899  BYTEBITS(); /* go to byte boundary */
900  NEEDBITS(32);
901  if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
902  strm->msg = (char *)"invalid stored block lengths";
903  state->mode = BAD;
904  break;
905  }
906  state->length = (unsigned)hold & 0xffff;
907  Tracev((stderr, "inflate: stored length %u\n",
908  state->length));
909  INITBITS();
910  state->mode = COPY_;
911  if (flush == Z_TREES) goto inf_leave;
912  /* fallthrough */
913  case COPY_:
914  state->mode = COPY;
915  /* fallthrough */
916  case COPY:
917  copy = state->length;
918  if (copy) {
919  if (copy > have) copy = have;
920  if (copy > left) copy = left;
921  if (copy == 0) goto inf_leave;
922  zmemcpy(put, next, copy);
923  have -= copy;
924  next += copy;
925  left -= copy;
926  put += copy;
927  state->length -= copy;
928  break;
929  }
930  Tracev((stderr, "inflate: stored end\n"));
931  state->mode = TYPE;
932  break;
933  case TABLE:
934  NEEDBITS(14);
935  state->nlen = BITS(5) + 257;
936  DROPBITS(5);
937  state->ndist = BITS(5) + 1;
938  DROPBITS(5);
939  state->ncode = BITS(4) + 4;
940  DROPBITS(4);
941 #ifndef PKZIP_BUG_WORKAROUND
942  if (state->nlen > 286 || state->ndist > 30) {
943  strm->msg = (char *)"too many length or distance symbols";
944  state->mode = BAD;
945  break;
946  }
947 #endif
948  Tracev((stderr, "inflate: table sizes ok\n"));
949  state->have = 0;
950  state->mode = LENLENS;
951  /* fallthrough */
952  case LENLENS:
953  while (state->have < state->ncode) {
954  NEEDBITS(3);
955  state->lens[order[state->have++]] = (unsigned short)BITS(3);
956  DROPBITS(3);
957  }
958  while (state->have < 19)
959  state->lens[order[state->have++]] = 0;
960  state->next = state->codes;
961  state->lencode = (const code FAR *)(state->next);
962  state->lenbits = 7;
963  ret = inflate_table(CODES, state->lens, 19, &(state->next),
964  &(state->lenbits), state->work);
965  if (ret) {
966  strm->msg = (char *)"invalid code lengths set";
967  state->mode = BAD;
968  break;
969  }
970  Tracev((stderr, "inflate: code lengths ok\n"));
971  state->have = 0;
972  state->mode = CODELENS;
973  /* fallthrough */
974  case CODELENS:
975  while (state->have < state->nlen + state->ndist) {
976  for (;;) {
977  here = state->lencode[BITS(state->lenbits)];
978  if ((unsigned)(here.bits) <= bits) break;
979  PULLBYTE();
980  }
981  if (here.val < 16) {
982  DROPBITS(here.bits);
983  state->lens[state->have++] = here.val;
984  }
985  else {
986  if (here.val == 16) {
987  NEEDBITS(here.bits + 2);
988  DROPBITS(here.bits);
989  if (state->have == 0) {
990  strm->msg = (char *)"invalid bit length repeat";
991  state->mode = BAD;
992  break;
993  }
994  len = state->lens[state->have - 1];
995  copy = 3 + BITS(2);
996  DROPBITS(2);
997  }
998  else if (here.val == 17) {
999  NEEDBITS(here.bits + 3);
1000  DROPBITS(here.bits);
1001  len = 0;
1002  copy = 3 + BITS(3);
1003  DROPBITS(3);
1004  }
1005  else {
1006  NEEDBITS(here.bits + 7);
1007  DROPBITS(here.bits);
1008  len = 0;
1009  copy = 11 + BITS(7);
1010  DROPBITS(7);
1011  }
1012  if (state->have + copy > state->nlen + state->ndist) {
1013  strm->msg = (char *)"invalid bit length repeat";
1014  state->mode = BAD;
1015  break;
1016  }
1017  while (copy--)
1018  state->lens[state->have++] = (unsigned short)len;
1019  }
1020  }
1021 
1022  /* handle error breaks in while */
1023  if (state->mode == BAD) break;
1024 
1025  /* check for end-of-block code (better have one) */
1026  if (state->lens[256] == 0) {
1027  strm->msg = (char *)"invalid code -- missing end-of-block";
1028  state->mode = BAD;
1029  break;
1030  }
1031 
1032  /* build code tables -- note: do not change the lenbits or distbits
1033  values here (9 and 6) without reading the comments in inftrees.h
1034  concerning the ENOUGH constants, which depend on those values */
1035  state->next = state->codes;
1036  state->lencode = (const code FAR *)(state->next);
1037  state->lenbits = 9;
1038  ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
1039  &(state->lenbits), state->work);
1040  if (ret) {
1041  strm->msg = (char *)"invalid literal/lengths set";
1042  state->mode = BAD;
1043  break;
1044  }
1045  state->distcode = (const code FAR *)(state->next);
1046  state->distbits = 6;
1047  ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
1048  &(state->next), &(state->distbits), state->work);
1049  if (ret) {
1050  strm->msg = (char *)"invalid distances set";
1051  state->mode = BAD;
1052  break;
1053  }
1054  Tracev((stderr, "inflate: codes ok\n"));
1055  state->mode = LEN_;
1056  if (flush == Z_TREES) goto inf_leave;
1057  /* fallthrough */
1058  case LEN_:
1059  state->mode = LEN;
1060  /* fallthrough */
1061  case LEN:
1062  if (have >= 6 && left >= 258) {
1063  RESTORE();
1064  inflate_fast(strm, out);
1065  LOAD();
1066  if (state->mode == TYPE)
1067  state->back = -1;
1068  break;
1069  }
1070  state->back = 0;
1071  for (;;) {
1072  here = state->lencode[BITS(state->lenbits)];
1073  if ((unsigned)(here.bits) <= bits) break;
1074  PULLBYTE();
1075  }
1076  if (here.op && (here.op & 0xf0) == 0) {
1077  last = here;
1078  for (;;) {
1079  here = state->lencode[last.val +
1080  (BITS(last.bits + last.op) >> last.bits)];
1081  if ((unsigned)(last.bits + here.bits) <= bits) break;
1082  PULLBYTE();
1083  }
1084  DROPBITS(last.bits);
1085  state->back += last.bits;
1086  }
1087  DROPBITS(here.bits);
1088  state->back += here.bits;
1089  state->length = (unsigned)here.val;
1090  if ((int)(here.op) == 0) {
1091  Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
1092  "inflate: literal '%c'\n" :
1093  "inflate: literal 0x%02x\n", here.val));
1094  state->mode = LIT;
1095  break;
1096  }
1097  if (here.op & 32) {
1098  Tracevv((stderr, "inflate: end of block\n"));
1099  state->back = -1;
1100  state->mode = TYPE;
1101  break;
1102  }
1103  if (here.op & 64) {
1104  strm->msg = (char *)"invalid literal/length code";
1105  state->mode = BAD;
1106  break;
1107  }
1108  state->extra = (unsigned)(here.op) & 15;
1109  state->mode = LENEXT;
1110  /* fallthrough */
1111  case LENEXT:
1112  if (state->extra) {
1113  NEEDBITS(state->extra);
1114  state->length += BITS(state->extra);
1115  DROPBITS(state->extra);
1116  state->back += state->extra;
1117  }
1118  Tracevv((stderr, "inflate: length %u\n", state->length));
1119  state->was = state->length;
1120  state->mode = DIST;
1121  /* fallthrough */
1122  case DIST:
1123  for (;;) {
1124  here = state->distcode[BITS(state->distbits)];
1125  if ((unsigned)(here.bits) <= bits) break;
1126  PULLBYTE();
1127  }
1128  if ((here.op & 0xf0) == 0) {
1129  last = here;
1130  for (;;) {
1131  here = state->distcode[last.val +
1132  (BITS(last.bits + last.op) >> last.bits)];
1133  if ((unsigned)(last.bits + here.bits) <= bits) break;
1134  PULLBYTE();
1135  }
1136  DROPBITS(last.bits);
1137  state->back += last.bits;
1138  }
1139  DROPBITS(here.bits);
1140  state->back += here.bits;
1141  if (here.op & 64) {
1142  strm->msg = (char *)"invalid distance code";
1143  state->mode = BAD;
1144  break;
1145  }
1146  state->offset = (unsigned)here.val;
1147  state->extra = (unsigned)(here.op) & 15;
1148  state->mode = DISTEXT;
1149  /* fallthrough */
1150  case DISTEXT:
1151  if (state->extra) {
1152  NEEDBITS(state->extra);
1153  state->offset += BITS(state->extra);
1154  DROPBITS(state->extra);
1155  state->back += state->extra;
1156  }
1157 #ifdef INFLATE_STRICT
1158  if (state->offset > state->dmax) {
1159  strm->msg = (char *)"invalid distance too far back";
1160  state->mode = BAD;
1161  break;
1162  }
1163 #endif
1164  Tracevv((stderr, "inflate: distance %u\n", state->offset));
1165  state->mode = MATCH;
1166  /* fallthrough */
1167  case MATCH:
1168  if (left == 0) goto inf_leave;
1169  copy = out - left;
1170  if (state->offset > copy) { /* copy from window */
1171  copy = state->offset - copy;
1172  if (copy > state->whave) {
1173  if (state->sane) {
1174  strm->msg = (char *)"invalid distance too far back";
1175  state->mode = BAD;
1176  break;
1177  }
1178 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1179  Trace((stderr, "inflate.c too far\n"));
1180  copy -= state->whave;
1181  if (copy > state->length) copy = state->length;
1182  if (copy > left) copy = left;
1183  left -= copy;
1184  state->length -= copy;
1185  do {
1186  *put++ = 0;
1187  } while (--copy);
1188  if (state->length == 0) state->mode = LEN;
1189  break;
1190 #endif
1191  }
1192  if (copy > state->wnext) {
1193  copy -= state->wnext;
1194  from = state->window + (state->wsize - copy);
1195  }
1196  else
1197  from = state->window + (state->wnext - copy);
1198  if (copy > state->length) copy = state->length;
1199  }
1200  else { /* copy from output */
1201  from = put - state->offset;
1202  copy = state->length;
1203  }
1204  if (copy > left) copy = left;
1205  left -= copy;
1206  state->length -= copy;
1207  do {
1208  *put++ = *from++;
1209  } while (--copy);
1210  if (state->length == 0) state->mode = LEN;
1211  break;
1212  case LIT:
1213  if (left == 0) goto inf_leave;
1214  *put++ = (unsigned char)(state->length);
1215  left--;
1216  state->mode = LEN;
1217  break;
1218  case CHECK:
1219  if (state->wrap) {
1220  NEEDBITS(32);
1221  out -= left;
1222  strm->total_out += out;
1223  state->total += out;
1224  if ((state->wrap & 4) && out)
1225  strm->adler = state->check =
1226  UPDATE_CHECK(state->check, put - out, out);
1227  out = left;
1228  if ((state->wrap & 4) && (
1229 #ifdef GUNZIP
1230  state->flags ? hold :
1231 #endif
1232  ZSWAP32(hold)) != state->check) {
1233  strm->msg = (char *)"incorrect data check";
1234  state->mode = BAD;
1235  break;
1236  }
1237  INITBITS();
1238  Tracev((stderr, "inflate: check matches trailer\n"));
1239  }
1240 #ifdef GUNZIP
1241  state->mode = LENGTH;
1242  /* fallthrough */
1243  case LENGTH:
1244  if (state->wrap && state->flags) {
1245  NEEDBITS(32);
1246  if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
1247  strm->msg = (char *)"incorrect length check";
1248  state->mode = BAD;
1249  break;
1250  }
1251  INITBITS();
1252  Tracev((stderr, "inflate: length matches trailer\n"));
1253  }
1254 #endif
1255  state->mode = DONE;
1256  /* fallthrough */
1257  case DONE:
1258  ret = Z_STREAM_END;
1259  goto inf_leave;
1260  case BAD:
1261  ret = Z_DATA_ERROR;
1262  goto inf_leave;
1263  case MEM:
1264  return Z_MEM_ERROR;
1265  case SYNC:
1266  /* fallthrough */
1267  default:
1268  return Z_STREAM_ERROR;
1269  }
1270 
1271  /*
1272  Return from inflate(), updating the total counts and the check value.
1273  If there was no progress during the inflate() call, return a buffer
1274  error. Call updatewindow() to create and/or update the window state.
1275  Note: a memory error from inflate() is non-recoverable.
1276  */
1277  inf_leave:
1278  RESTORE();
1279  if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
1280  (state->mode < CHECK || flush != Z_FINISH)))
1282  state->mode = MEM;
1283  return Z_MEM_ERROR;
1284  }
1285  in -= strm->avail_in;
1286  out -= strm->avail_out;
1287  strm->total_in += in;
1288  strm->total_out += out;
1289  state->total += out;
1290  if ((state->wrap & 4) && out)
1291  strm->adler = state->check =
1292  UPDATE_CHECK(state->check, strm->next_out - out, out);
1293  strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
1294  (state->mode == TYPE ? 128 : 0) +
1295  (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
1296  if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
1297  ret = Z_BUF_ERROR;
1298  return ret;
1299 }
size_t len
Definition: 6502dis.c:15
const lzma_allocator const uint8_t * in
Definition: block.h:527
const lzma_allocator const uint8_t size_t uint8_t * out
Definition: block.h:528
#define NAME(x, y)
Definition: elf-bfd.h:50
void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start)
Definition: inffast.c:50
@ TABLE
Definition: inflate9.h:15
@ STORED
Definition: inflate9.h:14
@ TYPE
Definition: inflate9.h:13
@ LEN
Definition: inflate9.h:16
#define LOAD()
Definition: inflate.c:477
void fixedtables(struct inflate_state FAR *state)
Definition: inflate.c:279
#define CRC2(check, word)
Definition: inflate.c:459
#define INITBITS()
Definition: inflate.c:499
#define CRC4(check, word)
Definition: inflate.c:466
#define BITS(n)
Definition: inflate.c:524
#define DROPBITS(n)
Definition: inflate.c:528
int inflateStateCheck(z_streamp strm)
Definition: inflate.c:105
#define BYTEBITS()
Definition: inflate.c:535
#define NEEDBITS(n)
Definition: inflate.c:517
int updatewindow(z_streamp strm, const Bytef *end, unsigned copy)
Definition: inflate.c:397
#define PULLBYTE()
Definition: inflate.c:507
#define UPDATE_CHECK(check, buf, len)
Definition: inflate.c:451
#define RESTORE()
Definition: inflate.c:488
@ HEAD
Definition: inflate.h:21
@ MATCH
Definition: inflate.h:45
@ DICT
Definition: inflate.h:31
@ LENGTH
Definition: inflate.h:48
@ FLAGS
Definition: inflate.h:22
@ LIT
Definition: inflate.h:46
@ SYNC
Definition: inflate.h:52
@ OS
Definition: inflate.h:24
@ EXLEN
Definition: inflate.h:25
@ MEM
Definition: inflate.h:51
@ CODELENS
Definition: inflate.h:39
@ DICTID
Definition: inflate.h:30
@ TYPEDO
Definition: inflate.h:33
@ COMMENT
Definition: inflate.h:28
@ LENLENS
Definition: inflate.h:38
@ COPY
Definition: inflate.h:36
@ LEN_
Definition: inflate.h:40
@ COPY_
Definition: inflate.h:35
@ DIST
Definition: inflate.h:43
@ LENEXT
Definition: inflate.h:42
@ HCRC
Definition: inflate.h:29
@ TIME
Definition: inflate.h:23
@ CHECK
Definition: inflate.h:47
@ DISTEXT
Definition: inflate.h:44
@ EXTRA
Definition: inflate.h:26
#define GUNZIP
Definition: inflate.h:16
@ CODES
Definition: inftree9.h:54
#define BAD
Definition: regex2.h:141
static struct sockaddr static addrlen static backlog const void static flags void struct sockaddr from
Definition: sfsocketcall.h:123
static int
Definition: sfsocketcall.h:114
unsigned char op
Definition: inftree9.h:25
unsigned char bits
Definition: inftree9.h:26
unsigned short val
Definition: inftree9.h:27
unsigned have
Definition: inflate9.h:42
unsigned long hold
Definition: inflate.h:102
code FAR * next
Definition: inflate9.h:43
uint64_t total_in
Definition: base.h:488
uint64_t total_out
Definition: base.h:492
unsigned next
Definition: blast.c:56
uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len)
Definition: adler32.c:134
if(dbg->bits==RZ_SYS_BITS_64)
Definition: windows-arm64.h:4
#define z_const
Definition: zconf.h:237
Byte FAR Bytef
Definition: zconf.h:400
#define FAR
Definition: zconf.h:387
@ DONE
#define L
Definition: zip_err_str.c:7
#define Z_TREES
Definition: zlib.h:174
#define Z_DEFLATED
Definition: zlib.h:209
#define Z_NEED_DICT
Definition: zlib.h:179
#define Z_BUF_ERROR
Definition: zlib.h:184
#define Z_BLOCK
Definition: zlib.h:173
#define Z_STREAM_END
Definition: zlib.h:178
#define Z_FINISH
Definition: zlib.h:172
#define Z_OK
Definition: zlib.h:177
#define Z_DATA_ERROR
Definition: zlib.h:182
#define Z_STREAM_ERROR
Definition: zlib.h:181
#define Z_NULL
Definition: zlib.h:212
#define Z_MEM_ERROR
Definition: zlib.h:183
void ZLIB_INTERNAL zmemcpy(Bytef *dest, const Bytef *source, uInt len)
Definition: zutil.c:149
#define Tracev(x)
Definition: zutil.h:253
#define Trace(x)
Definition: zutil.h:252
#define ZSWAP32(q)
Definition: zutil.h:271
#define Tracevv(x)
Definition: zutil.h:254

References adler32(), lzma_stream::avail_in, lzma_stream::avail_out, BAD, bits(), code::bits, BITS, BYTEBITS, CHECK, CODELENS, CODES, COMMENT, COPY, COPY_, CRC2, crc32(), CRC4, DICT, DICTID, DIST, DISTEXT, DISTS, DONE, DROPBITS, EXLEN, EXTRA, FAR, fixedtables(), FLAGS, from, GUNZIP, inflate_state::have, HCRC, HEAD, inflate_state::hold, if(), in, inflate_fast(), inflate_table(), inflateStateCheck(), INITBITS, int, L, inflate_state::last, len, LEN, LEN_, LENEXT, LENGTH, LENLENS, LENS, LIT, LOAD, MATCH, MEM, NAME, NEEDBITS, state::next, inflate_state::next, lzma_stream::next_in, lzma_stream::next_out, code::op, OS, out, PULLBYTE, RESTORE, STORED, strm, SYNC, TABLE, TIME, lzma_stream::total_in, lzma_stream::total_out, Trace, Tracev, Tracevv, TYPE, TYPEDO, unsigned, UPDATE_CHECK, updatewindow(), code::val, Z_BLOCK, Z_BUF_ERROR, z_const, Z_DATA_ERROR, Z_DEFLATED, Z_FINISH, Z_MEM_ERROR, Z_NEED_DICT, Z_NULL, Z_OK, Z_STREAM_END, Z_STREAM_ERROR, Z_TREES, zmemcpy(), and ZSWAP32.

Referenced by deflate_index_build(), deflate_index_extract(), gz_decomp(), gzcopy(), gzip_normalize(), gzscan(), inf(), main(), process(), recompress(), uncompress2(), and unzReadCurrentFile().

◆ inflateCodesUsed()

unsigned long ZEXPORT inflateCodesUsed ( z_streamp  strm)

Definition at line 1585 of file inflate.c.

1587 {
1588  struct inflate_state FAR *state;
1589  if (inflateStateCheck(strm)) return (unsigned long)-1;
1590  state = (struct inflate_state FAR *)strm->state;
1591  return (unsigned long)(state->next - state->codes);
1592 }

References FAR, inflateStateCheck(), state::next, and strm.

◆ inflateCopy()

int ZEXPORT inflateCopy ( z_streamp  dest,
z_streamp  source 
)

Definition at line 1492 of file inflate.c.

1495 {
1496  struct inflate_state FAR *state;
1497  struct inflate_state FAR *copy;
1498  unsigned char FAR *window;
1499  unsigned wsize;
1500 
1501  /* check input */
1502  if (inflateStateCheck(source) || dest == Z_NULL)
1503  return Z_STREAM_ERROR;
1504  state = (struct inflate_state FAR *)source->state;
1505 
1506  /* allocate space */
1507  copy = (struct inflate_state FAR *)
1508  ZALLOC(source, 1, sizeof(struct inflate_state));
1509  if (copy == Z_NULL) return Z_MEM_ERROR;
1510  window = Z_NULL;
1511  if (state->window != Z_NULL) {
1512  window = (unsigned char FAR *)
1513  ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
1514  if (window == Z_NULL) {
1515  ZFREE(source, copy);
1516  return Z_MEM_ERROR;
1517  }
1518  }
1519 
1520  /* copy state */
1521  zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
1522  zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
1523  copy->strm = dest;
1524  if (state->lencode >= state->codes &&
1525  state->lencode <= state->codes + ENOUGH - 1) {
1526  copy->lencode = copy->codes + (state->lencode - state->codes);
1527  copy->distcode = copy->codes + (state->distcode - state->codes);
1528  }
1529  copy->next = copy->codes + (state->next - state->codes);
1530  if (window != Z_NULL) {
1531  wsize = 1U << state->wbits;
1532  zmemcpy(window, state->window, wsize);
1533  }
1534  copy->window = window;
1535  dest->state = (struct internal_state FAR *)copy;
1536  return Z_OK;
1537 }
#define ENOUGH
Definition: inftree9.h:50
const char * source
Definition: lz4.h:699
char * dest
Definition: lz4.h:697
unsigned wsize
Definition: inflate.h:97
struct _window window
Byte FAR * voidpf
Definition: zconf.h:413
#define ZALLOC(strm, items, size)
Definition: zutil.h:265
#define ZFREE(strm, addr)
Definition: zutil.h:267

References inflate_state::codes, dest, inflate_state::distcode, ENOUGH, FAR, inflateStateCheck(), inflate_state::lencode, state::next, inflate_state::next, source, inflate_state::strm, inflate_state::window, inflate_state::wsize, Z_MEM_ERROR, Z_NULL, Z_OK, Z_STREAM_ERROR, ZALLOC, ZFREE, and zmemcpy().

◆ inflateEnd()

int ZEXPORT inflateEnd ( z_streamp  strm)

Definition at line 1301 of file inflate.c.

1303 {
1304  struct inflate_state FAR *state;
1305  if (inflateStateCheck(strm))
1306  return Z_STREAM_ERROR;
1307  state = (struct inflate_state FAR *)strm->state;
1308  if (state->window != Z_NULL) ZFREE(strm, state->window);
1309  ZFREE(strm, strm->state);
1310  strm->state = Z_NULL;
1311  Tracev((stderr, "inflate: end\n"));
1312  return Z_OK;
1313 }

References FAR, if(), inflateStateCheck(), strm, Tracev, Z_NULL, Z_OK, Z_STREAM_ERROR, and ZFREE.

Referenced by deflate_index_build(), deflate_index_extract(), end(), gzclose_r(), gzcopy(), gzip_normalize(), gzscan(), inf(), main(), uncompress2(), and unzCloseCurrentFile().

◆ inflateGetDictionary()

int ZEXPORT inflateGetDictionary ( z_streamp  strm,
Bytef dictionary,
uInt dictLength 
)

Definition at line 1315 of file inflate.c.

1319 {
1320  struct inflate_state FAR *state;
1321 
1322  /* check state */
1323  if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1324  state = (struct inflate_state FAR *)strm->state;
1325 
1326  /* copy dictionary */
1327  if (state->whave && dictionary != Z_NULL) {
1328  zmemcpy(dictionary, state->window + state->wnext,
1329  state->whave - state->wnext);
1330  zmemcpy(dictionary + state->whave - state->wnext,
1331  state->window, state->wnext);
1332  }
1333  if (dictLength != Z_NULL)
1334  *dictLength = state->whave;
1335  return Z_OK;
1336 }

References FAR, if(), inflateStateCheck(), strm, Z_NULL, Z_OK, Z_STREAM_ERROR, and zmemcpy().

◆ inflateGetHeader()

int ZEXPORT inflateGetHeader ( z_streamp  strm,
gz_headerp  head 
)

Definition at line 1373 of file inflate.c.

1376 {
1377  struct inflate_state FAR *state;
1378 
1379  /* check state */
1380  if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1381  state = (struct inflate_state FAR *)strm->state;
1382  if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
1383 
1384  /* save header structure */
1385  state->head = head;
1386  head->done = 0;
1387  return Z_OK;
1388 }

References FAR, test-lz4-versions::head, if(), inflateStateCheck(), strm, Z_OK, and Z_STREAM_ERROR.

◆ inflateInit2_()

int ZEXPORT inflateInit2_ ( z_streamp  strm,
int  windowBits,
const char *  version,
int  stream_size 
)

Definition at line 196 of file inflate.c.

201 {
202  int ret;
203  struct inflate_state FAR *state;
204 
205  if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
206  stream_size != (int)(sizeof(z_stream)))
207  return Z_VERSION_ERROR;
208  if (strm == Z_NULL) return Z_STREAM_ERROR;
209  strm->msg = Z_NULL; /* in case we return an error */
210  if (strm->zalloc == (alloc_func)0) {
211 #ifdef Z_SOLO
212  return Z_STREAM_ERROR;
213 #else
214  strm->zalloc = zcalloc;
215  strm->opaque = (voidpf)0;
216 #endif
217  }
218  if (strm->zfree == (free_func)0)
219 #ifdef Z_SOLO
220  return Z_STREAM_ERROR;
221 #else
222  strm->zfree = zcfree;
223 #endif
224  state = (struct inflate_state FAR *)
225  ZALLOC(strm, 1, sizeof(struct inflate_state));
226  if (state == Z_NULL) return Z_MEM_ERROR;
227  Tracev((stderr, "inflate: allocated\n"));
228  strm->state = (struct internal_state FAR *)state;
229  state->strm = strm;
230  state->window = Z_NULL;
231  state->mode = HEAD; /* to pass state test in inflateReset2() */
232  ret = inflateReset2(strm, windowBits);
233  if (ret != Z_OK) {
234  ZFREE(strm, state);
235  strm->state = Z_NULL;
236  }
237  return ret;
238 }
int ZEXPORT inflateReset2(z_streamp strm, int windowBits)
Definition: inflate.c:158
#define ZLIB_VERSION
Definition: zlib.h:40
#define Z_VERSION_ERROR
Definition: zlib.h:185
void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr)
Definition: zutil.c:315
voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size)
Definition: zutil.c:305

References FAR, HEAD, inflateReset2(), strm, Tracev, Z_MEM_ERROR, Z_NULL, Z_OK, Z_STREAM_ERROR, Z_VERSION_ERROR, ZALLOC, zcalloc(), zcfree(), ZFREE, and ZLIB_VERSION.

Referenced by inflateInit_().

◆ inflateInit_()

int ZEXPORT inflateInit_ ( z_streamp  strm,
const char *  version,
int  stream_size 
)

Definition at line 240 of file inflate.c.

244 {
245  return inflateInit2_(strm, DEF_WBITS, version, stream_size);
246 }
int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, const char *version, int stream_size)
Definition: inflate.c:196
#define DEF_WBITS
Definition: zutil.h:68

References DEF_WBITS, inflateInit2_(), and strm.

◆ inflateMark()

long ZEXPORT inflateMark ( z_streamp  strm)

Definition at line 1572 of file inflate.c.

1574 {
1575  struct inflate_state FAR *state;
1576 
1577  if (inflateStateCheck(strm))
1578  return -(1L << 16);
1579  state = (struct inflate_state FAR *)strm->state;
1580  return (long)(((unsigned long)((long)state->back)) << 16) +
1581  (state->mode == COPY ? state->length :
1582  (state->mode == MATCH ? state->was - state->length : 0));
1583 }
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags long
Definition: sflib.h:79

References COPY, FAR, inflateStateCheck(), long, MATCH, and strm.

◆ inflatePrime()

int ZEXPORT inflatePrime ( z_streamp  strm,
int  bits,
int  value 
)

Definition at line 248 of file inflate.c.

252 {
253  struct inflate_state FAR *state;
254 
256  state = (struct inflate_state FAR *)strm->state;
257  if (bits < 0) {
258  state->hold = 0;
259  state->bits = 0;
260  return Z_OK;
261  }
262  if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR;
263  value &= (1L << bits) - 1;
264  state->hold += (unsigned)value << state->bits;
265  state->bits += (uInt)bits;
266  return Z_OK;
267 }
static int value
Definition: cmd_api.c:93
unsigned int uInt
Definition: zconf.h:393

References bits(), FAR, if(), inflateStateCheck(), strm, unsigned, value, Z_OK, and Z_STREAM_ERROR.

Referenced by deflate_index_extract().

◆ inflateReset()

int ZEXPORT inflateReset ( z_streamp  strm)

Definition at line 145 of file inflate.c.

147 {
148  struct inflate_state FAR *state;
149 
151  state = (struct inflate_state FAR *)strm->state;
152  state->wsize = 0;
153  state->whave = 0;
154  state->wnext = 0;
155  return inflateResetKeep(strm);
156 }
int ZEXPORT inflateResetKeep(z_streamp strm)
Definition: inflate.c:119

References FAR, inflateResetKeep(), inflateStateCheck(), strm, and Z_STREAM_ERROR.

Referenced by deflate_index_build(), gz_look(), gzip_normalize(), inflateReset2(), inflateSync(), and main().

◆ inflateReset2()

int ZEXPORT inflateReset2 ( z_streamp  strm,
int  windowBits 
)

Definition at line 158 of file inflate.c.

161 {
162  int wrap;
163  struct inflate_state FAR *state;
164 
165  /* get the state */
167  state = (struct inflate_state FAR *)strm->state;
168 
169  /* extract wrap request from windowBits parameter */
170  if (windowBits < 0) {
171  wrap = 0;
172  windowBits = -windowBits;
173  }
174  else {
175  wrap = (windowBits >> 4) + 5;
176 #ifdef GUNZIP
177  if (windowBits < 48)
178  windowBits &= 15;
179 #endif
180  }
181 
182  /* set number of window bits, free window if different */
183  if (windowBits && (windowBits < 8 || windowBits > 15))
184  return Z_STREAM_ERROR;
185  if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {
186  ZFREE(strm, state->window);
187  state->window = Z_NULL;
188  }
189 
190  /* update state and reset the rest of it */
191  state->wrap = wrap;
192  state->wbits = (unsigned)windowBits;
193  return inflateReset(strm);
194 }
int ZEXPORT inflateReset(z_streamp strm)
Definition: inflate.c:145

References FAR, if(), inflateReset(), inflateStateCheck(), strm, unsigned, inflate_state::wrap, Z_NULL, Z_STREAM_ERROR, and ZFREE.

Referenced by deflate_index_extract(), and inflateInit2_().

◆ inflateResetKeep()

int ZEXPORT inflateResetKeep ( z_streamp  strm)

Definition at line 119 of file inflate.c.

121 {
122  struct inflate_state FAR *state;
123 
125  state = (struct inflate_state FAR *)strm->state;
126  strm->total_in = strm->total_out = state->total = 0;
127  strm->msg = Z_NULL;
128  if (state->wrap) /* to support ill-conceived Java test suite */
129  strm->adler = state->wrap & 1;
130  state->mode = HEAD;
131  state->last = 0;
132  state->havedict = 0;
133  state->flags = -1;
134  state->dmax = 32768U;
135  state->head = Z_NULL;
136  state->hold = 0;
137  state->bits = 0;
138  state->lencode = state->distcode = state->next = state->codes;
139  state->sane = 1;
140  state->back = -1;
141  Tracev((stderr, "inflate: reset\n"));
142  return Z_OK;
143 }

References FAR, HEAD, if(), inflateStateCheck(), state::next, strm, lzma_stream::total_in, lzma_stream::total_out, Tracev, Z_NULL, Z_OK, and Z_STREAM_ERROR.

Referenced by inflateReset().

◆ inflateSetDictionary()

int ZEXPORT inflateSetDictionary ( z_streamp  strm,
const Bytef dictionary,
uInt  dictLength 
)

Definition at line 1338 of file inflate.c.

1342 {
1343  struct inflate_state FAR *state;
1344  unsigned long dictid;
1345  int ret;
1346 
1347  /* check state */
1348  if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1349  state = (struct inflate_state FAR *)strm->state;
1350  if (state->wrap != 0 && state->mode != DICT)
1351  return Z_STREAM_ERROR;
1352 
1353  /* check for correct dictionary identifier */
1354  if (state->mode == DICT) {
1355  dictid = adler32(0L, Z_NULL, 0);
1356  dictid = adler32(dictid, dictionary, dictLength);
1357  if (dictid != state->check)
1358  return Z_DATA_ERROR;
1359  }
1360 
1361  /* copy dictionary to window using updatewindow(), which will amend the
1362  existing dictionary if appropriate */
1363  ret = updatewindow(strm, dictionary + dictLength, dictLength);
1364  if (ret) {
1365  state->mode = MEM;
1366  return Z_MEM_ERROR;
1367  }
1368  state->havedict = 1;
1369  Tracev((stderr, "inflate: dictionary set\n"));
1370  return Z_OK;
1371 }

References adler32(), DICT, FAR, if(), inflateStateCheck(), L, MEM, strm, Tracev, updatewindow(), Z_DATA_ERROR, Z_MEM_ERROR, Z_NULL, Z_OK, and Z_STREAM_ERROR.

Referenced by deflate_index_extract().

◆ inflateStateCheck()

int inflateStateCheck ( z_streamp  strm)

Definition at line 105 of file inflate.c.

107 {
108  struct inflate_state FAR *state;
109  if (strm == Z_NULL ||
110  strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
111  return 1;
112  state = (struct inflate_state FAR *)strm->state;
113  if (state == Z_NULL || state->strm != strm ||
114  state->mode < HEAD || state->mode > SYNC)
115  return 1;
116  return 0;
117 }

References FAR, HEAD, if(), strm, SYNC, and Z_NULL.

Referenced by inflate(), inflateCodesUsed(), inflateCopy(), inflateEnd(), inflateGetDictionary(), inflateGetHeader(), inflateMark(), inflatePrime(), inflateReset(), inflateReset2(), inflateResetKeep(), inflateSetDictionary(), inflateSync(), inflateSyncPoint(), inflateUndermine(), and inflateValidate().

◆ inflateSync()

int ZEXPORT inflateSync ( z_streamp  strm)

Definition at line 1424 of file inflate.c.

1426 {
1427  unsigned len; /* number of bytes to look at or looked at */
1428  int flags; /* temporary to save header status */
1429  unsigned long in, out; /* temporary to save total_in and total_out */
1430  unsigned char buf[4]; /* to restore bit buffer to byte string */
1431  struct inflate_state FAR *state;
1432 
1433  /* check parameters */
1434  if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1435  state = (struct inflate_state FAR *)strm->state;
1436  if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
1437 
1438  /* if first time, start search in bit buffer */
1439  if (state->mode != SYNC) {
1440  state->mode = SYNC;
1441  state->hold <<= state->bits & 7;
1442  state->bits -= state->bits & 7;
1443  len = 0;
1444  while (state->bits >= 8) {
1445  buf[len++] = (unsigned char)(state->hold);
1446  state->hold >>= 8;
1447  state->bits -= 8;
1448  }
1449  state->have = 0;
1450  syncsearch(&(state->have), buf, len);
1451  }
1452 
1453  /* search available input */
1454  len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
1455  strm->avail_in -= len;
1456  strm->next_in += len;
1457  strm->total_in += len;
1458 
1459  /* return no joy or set up to restart inflate() on a new block */
1460  if (state->have != 4) return Z_DATA_ERROR;
1461  if (state->flags == -1)
1462  state->wrap = 0; /* if no header yet, treat as raw */
1463  else
1464  state->wrap &= ~4; /* no point in computing a check value now */
1465  flags = state->flags;
1466  in = strm->total_in; out = strm->total_out;
1467  inflateReset(strm);
1468  strm->total_in = in; strm->total_out = out;
1469  state->flags = flags;
1470  state->mode = TYPE;
1471  return Z_OK;
1472 }
unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf, unsigned len)
Definition: inflate.c:1401
voidpf void * buf
Definition: ioapi.h:138
static struct sockaddr static addrlen static backlog const void static flags void flags
Definition: sfsocketcall.h:123

References lzma_stream::avail_in, FAR, flags, if(), in, inflateReset(), inflateStateCheck(), len, lzma_stream::next_in, out, strm, SYNC, syncsearch(), lzma_stream::total_in, lzma_stream::total_out, TYPE, Z_BUF_ERROR, Z_DATA_ERROR, Z_OK, and Z_STREAM_ERROR.

◆ inflateSyncPoint()

int ZEXPORT inflateSyncPoint ( z_streamp  strm)

Definition at line 1482 of file inflate.c.

1484 {
1485  struct inflate_state FAR *state;
1486 
1487  if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1488  state = (struct inflate_state FAR *)strm->state;
1489  return state->mode == STORED && state->bits == 0;
1490 }

References FAR, inflateStateCheck(), STORED, strm, and Z_STREAM_ERROR.

◆ inflateUndermine()

int ZEXPORT inflateUndermine ( z_streamp  strm,
int  subvert 
)

Definition at line 1539 of file inflate.c.

1542 {
1543  struct inflate_state FAR *state;
1544 
1545  if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1546  state = (struct inflate_state FAR *)strm->state;
1547 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
1548  state->sane = !subvert;
1549  return Z_OK;
1550 #else
1551  (void)subvert;
1552  state->sane = 1;
1553  return Z_DATA_ERROR;
1554 #endif
1555 }
else

References else, FAR, inflateStateCheck(), strm, Z_DATA_ERROR, Z_OK, and Z_STREAM_ERROR.

◆ inflateValidate()

int ZEXPORT inflateValidate ( z_streamp  strm,
int  check 
)

Definition at line 1557 of file inflate.c.

1560 {
1561  struct inflate_state FAR *state;
1562 
1563  if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
1564  state = (struct inflate_state FAR *)strm->state;
1565  if (check && state->wrap)
1566  state->wrap |= 4;
1567  else
1568  state->wrap &= ~4;
1569  return Z_OK;
1570 }

References check, FAR, if(), inflateStateCheck(), strm, Z_OK, and Z_STREAM_ERROR.

◆ OF() [1/4]

void fixedtables OF ( (struct inflate_state FAR *state )

◆ OF() [2/4]

◆ OF() [3/4]

◆ OF() [4/4]

◆ syncsearch()

unsigned syncsearch ( unsigned FAR have,
const unsigned char FAR buf,
unsigned  len 
)

Definition at line 1401 of file inflate.c.

1405 {
1406  unsigned got;
1407  unsigned next;
1408 
1409  got = *have;
1410  next = 0;
1411  while (next < len && got < 4) {
1412  if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
1413  got++;
1414  else if (buf[next])
1415  got = 0;
1416  else
1417  got = 4 - got;
1418  next++;
1419  }
1420  *have = got;
1421  return next;
1422 }

References inflate_state::have, len, and inflate_state::next.

Referenced by inflateSync().

◆ updatewindow()

int updatewindow ( z_streamp  strm,
const Bytef end,
unsigned  copy 
)

Definition at line 397 of file inflate.c.

401 {
402  struct inflate_state FAR *state;
403  unsigned dist;
404 
405  state = (struct inflate_state FAR *)strm->state;
406 
407  /* if it hasn't been done already, allocate space for the window */
408  if (state->window == Z_NULL) {
409  state->window = (unsigned char FAR *)
410  ZALLOC(strm, 1U << state->wbits,
411  sizeof(unsigned char));
412  if (state->window == Z_NULL) return 1;
413  }
414 
415  /* if window not in use yet, initialize */
416  if (state->wsize == 0) {
417  state->wsize = 1U << state->wbits;
418  state->wnext = 0;
419  state->whave = 0;
420  }
421 
422  /* copy state->wsize or less output bytes into the circular window */
423  if (copy >= state->wsize) {
424  zmemcpy(state->window, end - state->wsize, state->wsize);
425  state->wnext = 0;
426  state->whave = state->wsize;
427  }
428  else {
429  dist = state->wsize - state->wnext;
430  if (dist > copy) dist = copy;
431  zmemcpy(state->window + state->wnext, end - copy, dist);
432  copy -= dist;
433  if (copy) {
434  zmemcpy(state->window, end - copy, copy);
435  state->wnext = copy;
436  state->whave = state->wsize;
437  }
438  else {
439  state->wnext += dist;
440  if (state->wnext == state->wsize) state->wnext = 0;
441  if (state->whave < state->wsize) state->whave += dist;
442  }
443  }
444  return 0;
445 }

References test_evm::end, FAR, if(), strm, Z_NULL, ZALLOC, and zmemcpy().

Referenced by inflate(), and inflateSetDictionary().