cab_C_00.diff

Gregory M. Turner gmturner007 at ameritech.net
Fri Jun 6 14:08:17 CDT 2003


Not sure if this matters, but it can't hurt.

License: Bugroff

Changelog:

* dlls/cabinet: cabextract.c, cabinet.h:
  Greg Turner <gmturner007 at ameritech.net>
- paranoia: eliminate some global variables
- better reminder on how to fix memory leaks

--
diff -ur --minimal --exclude-from=/home/greg/bin/winetreediff_excl ../wine.vanilla/dlls/cabinet/cabextract.c ./dlls/cabinet/cabextract.c
--- ../wine.vanilla/dlls/cabinet/cabextract.c	2003-04-09 16:41:21.000000000 -0500
+++ ./dlls/cabinet/cabextract.c	2003-06-06 13:37:50.000000000 -0500
@@ -40,14 +40,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(cabinet);
 
-/* The first result of a search will be returned, and
- * the remaining results will be chained to it via the cab->next structure
- * member.
- */
-cab_UBYTE search_buf[CAB_SEARCH_SIZE];
-
-cab_decomp_state decomp_state;
-
 /* all the file IO is abstracted into these routines:
  * cabinet_(open|close|read|seek|skip|getoffset)
  * file_(open|close|write)
@@ -600,7 +592,7 @@
  * Ziphuft_build (internal)
  */
 cab_LONG Ziphuft_build(cab_ULONG *b, cab_ULONG n, cab_ULONG s, cab_UWORD *d, cab_UWORD *e,
-struct Ziphuft **t, cab_LONG *m)
+struct Ziphuft **t, cab_LONG *m, cab_decomp_state *decomp_state)
 {
   cab_ULONG a;                   	/* counter for codes of length k */
   cab_ULONG el;                  	/* length of EOB code (value 256) */
@@ -780,7 +772,7 @@
  * Zipinflate_codes (internal)
  */
 cab_LONG Zipinflate_codes(struct Ziphuft *tl, struct Ziphuft *td,
-  cab_LONG bl, cab_LONG bd)
+  cab_LONG bl, cab_LONG bd, cab_decomp_state *decomp_state)
 {
   register cab_ULONG e;  /* table entry flag/number of extra bits */
   cab_ULONG n, d;        /* length and index for copy */
@@ -862,7 +854,7 @@
 /***********************************************************
  * Zipinflate_stored (internal)
  */
-cab_LONG Zipinflate_stored(void)
+cab_LONG Zipinflate_stored(cab_decomp_state *decomp_state)
 /* "decompress" an inflated type 0 (stored) block. */
 {
   cab_ULONG n;           /* number of bytes in block */
@@ -906,7 +898,7 @@
 /******************************************************
  * Zipinflate_fixed (internal)
  */
-cab_LONG Zipinflate_fixed(void)
+cab_LONG Zipinflate_fixed(cab_decomp_state *decomp_state)
 {
   struct Ziphuft *fixed_tl;
   struct Ziphuft *fixed_td;
@@ -927,7 +919,7 @@
     l[i] = 8;
   fixed_bl = 7;
   if((i = Ziphuft_build(l, 288, 257, (cab_UWORD *) Zipcplens,
-  (cab_UWORD *) Zipcplext, &fixed_tl, &fixed_bl)))
+  (cab_UWORD *) Zipcplext, &fixed_tl, &fixed_bl, decomp_state)))
     return i;
 
   /* distance table */
@@ -935,14 +927,14 @@
     l[i] = 5;
   fixed_bd = 5;
   if((i = Ziphuft_build(l, 30, 0, (cab_UWORD *) Zipcpdist, (cab_UWORD *) Zipcpdext,
-  &fixed_td, &fixed_bd)) > 1)
+  &fixed_td, &fixed_bd, decomp_state)) > 1)
   {
     Ziphuft_free(fixed_tl);
     return i;
   }
 
   /* decompress until an end-of-block code */
-  i = Zipinflate_codes(fixed_tl, fixed_td, fixed_bl, fixed_bd);
+  i = Zipinflate_codes(fixed_tl, fixed_td, fixed_bl, fixed_bd, decomp_state);
 
   Ziphuft_free(fixed_td);
   Ziphuft_free(fixed_tl);
@@ -952,7 +944,7 @@
 /**************************************************************
  * Zipinflate_dynamic (internal)
  */
-cab_LONG Zipinflate_dynamic(void)
+cab_LONG Zipinflate_dynamic(cab_decomp_state *decomp_state)
  /* decompress an inflated type 2 (dynamic Huffman codes) block. */
 {
   cab_LONG i;          	/* temporary variables */
@@ -1001,7 +993,7 @@
 
   /* build decoding table for trees--single level, 7 bit lookup */
   bl = 7;
-  if((i = Ziphuft_build(ll, 19, 19, NULL, NULL, &tl, &bl)) != 0)
+  if((i = Ziphuft_build(ll, 19, 19, NULL, NULL, &tl, &bl, decomp_state)) != 0)
   {
     if(i == 1)
       Ziphuft_free(tl);
@@ -1063,17 +1055,19 @@
 
   /* build the decoding tables for literal/length and distance codes */
   bl = ZIPLBITS;
-  if((i = Ziphuft_build(ll, nl, 257, (cab_UWORD *) Zipcplens, (cab_UWORD *) Zipcplext, &tl, &bl)) != 0)
+  if((i = Ziphuft_build(ll, nl, 257, (cab_UWORD *) Zipcplens, (cab_UWORD *) Zipcplext,
+                        &tl, &bl, decomp_state)) != 0)
   {
     if(i == 1)
       Ziphuft_free(tl);
     return i;                   /* incomplete code set */
   }
   bd = ZIPDBITS;
-  Ziphuft_build(ll + nl, nd, 0, (cab_UWORD *) Zipcpdist, (cab_UWORD *) Zipcpdext, &td, &bd);
+  Ziphuft_build(ll + nl, nd, 0, (cab_UWORD *) Zipcpdist, (cab_UWORD *) Zipcpdext,
+                &td, &bd, decomp_state);
 
   /* decompress until an end-of-block code */
-  if(Zipinflate_codes(tl, td, bl, bd))
+  if(Zipinflate_codes(tl, td, bl, bd, decomp_state))
     return 1;
 
   /* free the decoding tables, return */
@@ -1085,7 +1079,7 @@
 /*****************************************************
  * Zipinflate_block (internal)
  */
-cab_LONG Zipinflate_block(cab_LONG *e) /* e == last block flag */
+cab_LONG Zipinflate_block(cab_LONG *e, cab_decomp_state *decomp_state) /* e == last block flag */
 { /* decompress an inflated block */
   cab_ULONG t;           	/* block type */
   register cab_ULONG b;     /* bit buffer */
@@ -1111,19 +1105,19 @@
 
   /* inflate that block type */
   if(t == 2)
-    return Zipinflate_dynamic();
+    return Zipinflate_dynamic(decomp_state);
   if(t == 0)
-    return Zipinflate_stored();
+    return Zipinflate_stored(decomp_state);
   if(t == 1)
-    return Zipinflate_fixed();
+    return Zipinflate_fixed(decomp_state);
   /* bad block type */
   return 2;
 }
 
 /****************************************************
- * Zipdecompress (internal)
+ * ZIPdecompress (internal)
  */
-int ZIPdecompress(int inlen, int outlen)
+int ZIPdecompress(int inlen, int outlen, cab_decomp_state *decomp_state)
 {
   cab_LONG e;               /* last block flag */
 
@@ -1141,7 +1135,7 @@
 
   do
   {
-    if(Zipinflate_block(&e))
+    if(Zipinflate_block(&e, decomp_state))
       return DECR_ILLEGALDATA;
   } while(!e);
 
@@ -1179,7 +1173,7 @@
 /******************************************************************
  * QTMinit (internal)
  */
-int QTMinit(int window, int level) {
+int QTMinit(int window, int level, cab_decomp_state *decomp_state) {
   int wndsize = 1 << window, msz = window * 2, i;
   cab_ULONG j;
 
@@ -1370,7 +1364,7 @@
 /*******************************************************************
  * QTMdecompress (internal)
  */
-int QTMdecompress(int inlen, int outlen)
+int QTMdecompress(int inlen, int outlen, cab_decomp_state *decomp_state)
 {
   cab_UBYTE *inpos  = CAB(inbuf);
   cab_UBYTE *window = QTM(window);
@@ -1554,7 +1548,7 @@
 /************************************************************
  * LZXinit (internal)
  */
-int LZXinit(int window) {
+int LZXinit(int window, cab_decomp_state *decomp_state) {
   cab_ULONG wndsize = 1 << window;
   int i, j, posn_slots;
 
@@ -1686,7 +1680,7 @@
  */
 #define READ_LENGTHS(tbl,first,last) do { \
   lb.bb = bitbuf; lb.bl = bitsleft; lb.ip = inpos; \
-  if (lzx_read_lens(LENTABLE(tbl),(first),(last),&lb)) { \
+  if (lzx_read_lens(LENTABLE(tbl),(first),(last),&lb,decomp_state)) { \
     return DECR_ILLEGALDATA; \
   } \
   bitbuf = lb.bb; bitsleft = lb.bl; inpos = lb.ip; \
@@ -1788,7 +1782,8 @@
 /************************************************************
  * lzx_read_lens (internal)
  */
-int lzx_read_lens(cab_UBYTE *lens, cab_ULONG first, cab_ULONG last, struct lzx_bits *lb) {
+int lzx_read_lens(cab_UBYTE *lens, cab_ULONG first, cab_ULONG last, struct lzx_bits *lb,
+                  cab_decomp_state *decomp_state) {
   cab_ULONG i,j, x,y;
   int z;
 
@@ -1834,7 +1829,7 @@
 /*******************************************************
  * LZXdecompress (internal)
  */
-int LZXdecompress(int inlen, int outlen) {
+int LZXdecompress(int inlen, int outlen, cab_decomp_state *decomp_state) {
   cab_UBYTE *inpos  = CAB(inbuf);
   cab_UBYTE *endinp = inpos + inlen;
   cab_UBYTE *window = LZX(window);
@@ -2157,7 +2152,7 @@
 /*********************************************************
  * find_cabs_in_file (internal)
  */
-struct cabinet *find_cabs_in_file(LPCSTR name)
+struct cabinet *find_cabs_in_file(LPCSTR name, cab_UBYTE search_buf[])
 {
   struct cabinet *cab, *cab2, *firstcab = NULL, *linkcab = NULL;
   cab_UBYTE *pstart = &search_buf[0], *pend, *p;
@@ -2360,8 +2355,9 @@
  * including spanning cabinets, and working out which file is in which
  * folder in which cabinet. It also throws out the duplicate file entries
  * that appear in spanning cabinets. There is memory leakage here because
- * those entries are not freed. See the XAD CAB client for an
- * implementation of this that correctly frees the discarded file entries.
+ * those entries are not freed. See the XAD CAB client (function CAB_GetInfo
+ * in CAB.c) for an implementation of this that correctly frees the discarded
+ * file entries.
  */
 struct cab_file *process_files(struct cabinet *basecab) {
   struct cabinet *cab;
@@ -2411,7 +2407,8 @@
               /* increase the number of splits */
               if ((i = ++(predfol->num_splits)) > CAB_SPLITMAX) {
                 mergeok = 0;
-                ERR("%s: internal error, increase CAB_SPLITMAX\n", debugstr_a(basecab->filename));
+                ERR("%s: internal error: CAB_SPLITMAX exceeded. please report this to wine-devel at winehq.org)\n",
+		    debugstr_a(basecab->filename));
               }
               else {
                 /* copy information across from the merged folder */
@@ -2497,7 +2494,7 @@
 /****************************************************
  * NONEdecompress (internal)
  */
-int NONEdecompress(int inlen, int outlen)
+int NONEdecompress(int inlen, int outlen, cab_decomp_state *decomp_state)
 {
   if (inlen != outlen) return DECR_ILLEGALDATA;
   memcpy(CAB(outbuf), CAB(inbuf), (size_t) inlen);
@@ -2528,7 +2525,7 @@
 /**********************************************************
  * decompress (internal)
  */
-int decompress(struct cab_file *fi, int savemode, int fix)
+int decompress(struct cab_file *fi, int savemode, int fix, cab_decomp_state *decomp_state)
 {
   cab_ULONG bytes = savemode ? fi->length : fi->offset - CAB(offset);
   struct cabinet *cab = CAB(current)->cab[CAB(split)];
@@ -2596,7 +2593,7 @@
     }
 
     /* decompress block */
-    if ((err = CAB(decompress)(inlen, outlen))) {
+    if ((err = CAB(decompress)(inlen, outlen, decomp_state))) {
       if (fix && ((fi->folder->comp_type & cffoldCOMPTYPE_MASK)
 		  == cffoldCOMPTYPE_MSZIP))
       {
@@ -2618,7 +2615,7 @@
  *
  * workhorse to extract a particular file from a cab
  */
-void extract_file(struct cab_file *fi, int lower, int fix, LPCSTR dir)
+void extract_file(struct cab_file *fi, int lower, int fix, LPCSTR dir, cab_decomp_state *decomp_state)
 {
   struct cab_folder *fol = fi->folder, *oldfol = CAB(current);
   cab_LONG err = DECR_OK;
@@ -2660,12 +2657,12 @@
 
     case cffoldCOMPTYPE_QUANTUM:
       CAB(decompress) = QTMdecompress;
-      err = QTMinit((comptype >> 8) & 0x1f, (comptype >> 4) & 0xF);
+      err = QTMinit((comptype >> 8) & 0x1f, (comptype >> 4) & 0xF, decomp_state);
       break;
 
     case cffoldCOMPTYPE_LZX:
       CAB(decompress) = LZXdecompress;
-      err = LZXinit((comptype >> 8) & 0x1f);
+      err = LZXinit((comptype >> 8) & 0x1f, decomp_state);
       break;
 
     default:
@@ -2685,12 +2682,12 @@
 
   if (fi->offset > CAB(offset)) {
     /* decode bytes and send them to /dev/null */
-    if ((err = decompress(fi, 0, fix))) goto exit_handler;
+    if ((err = decompress(fi, 0, fix, decomp_state))) goto exit_handler;
     CAB(offset) = fi->offset;
   }
   
   if (!file_open(fi, lower, dir)) return;
-  err = decompress(fi, 1, fix);
+  err = decompress(fi, 1, fix, decomp_state);
   if (err) CAB(current) = NULL; else CAB(offset) += fi->length;
   file_close(fi);
 
@@ -2772,15 +2769,24 @@
   struct cabinet *basecab, *cab, *cab1, *cab2;
   struct cab_file *filelist, *fi;
 
+  /* The first result of a search will be returned, and
+   * the remaining results will be chained to it via the cab->next structure
+   * member.
+   */
+  cab_UBYTE search_buf[CAB_SEARCH_SIZE];
+
+  cab_decomp_state decomp_state_local;
+  cab_decomp_state *decomp_state = &decomp_state_local;
+
   /* has the list-mode header been seen before? */
   int viewhdr = 0;
 
-  ZeroMemory(&decomp_state, sizeof(cab_decomp_state));
+  ZeroMemory(decomp_state, sizeof(cab_decomp_state));
 
   TRACE("Extract %s\n", debugstr_a(cabname));
 
   /* load the file requested */
-  basecab = find_cabs_in_file(cabname);
+  basecab = find_cabs_in_file(cabname, search_buf);
   if (!basecab) return FALSE;
 
   /* iterate over all cabinets found in that file */
@@ -2823,7 +2829,7 @@
     TRACE("Beginning Extraction...\n");
     for (fi = filelist; fi; fi = fi->next) {
 	TRACE("  extracting: %s\n", debugstr_a(fi->filename));
-	extract_file(fi, lower, fix, dir);
+	extract_file(fi, lower, fix, dir, decomp_state);
     }
   }
 
diff -ur --minimal --exclude-from=/home/greg/bin/winetreediff_excl ../wine.vanilla/dlls/cabinet/cabinet.h ./dlls/cabinet/cabinet.h
--- ../wine.vanilla/dlls/cabinet/cabinet.h	2003-01-29 21:49:43.000000000 -0600
+++ ./dlls/cabinet/cabinet.h	2003-06-06 13:44:00.000000000 -0500
@@ -211,10 +213,10 @@
 };
 
 /* generic stuff */
-#define CAB(x) (decomp_state.x)
-#define ZIP(x) (decomp_state.methods.zip.x)
-#define QTM(x) (decomp_state.methods.qtm.x)
-#define LZX(x) (decomp_state.methods.lzx.x)
+#define CAB(x) (decomp_state->x)
+#define ZIP(x) (decomp_state->methods.zip.x)
+#define QTM(x) (decomp_state->methods.qtm.x)
+#define LZX(x) (decomp_state->methods.lzx.x)
 #define DECR_OK           (0)
 #define DECR_DATAFORMAT   (1)
 #define DECR_ILLEGALDATA  (2)
@@ -269,13 +271,13 @@
   cab_UBYTE flags;                     /* header flags                   */
 };
 
-typedef struct {
+typedef struct cds_forward {
   struct cab_folder *current;      /* current folder we're extracting from  */
   cab_ULONG offset;                /* uncompressed offset within folder     */
   cab_UBYTE *outpos;               /* (high level) start of data to use up  */
   cab_UWORD outlen;                /* (high level) amount of data to use up */
   cab_UWORD split;                 /* at which split in current folder?     */
-  int (*decompress)(int, int);     /* the chosen compression func      */
+  int (*decompress)(int, int, struct cds_forward *);     /* the chosen compression func      */
   cab_UBYTE inbuf[CAB_INPUTMAX+2]; /* +2 for lzx bitbuffer overflows!  */
   cab_UBYTE outbuf[CAB_BLOCKMAX];
   union {
-- 
"A just security to property is not afforded by that government,
under which unequal taxes oppress one species of property and
reward another species." --James Madison

gmt




More information about the wine-patches mailing list