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