Author: cwittich Date: Sat Dec 27 04:00:27 2008 New Revision: 38372
URL: http://svn.reactos.org/svn/reactos?rev=38372&view=rev Log: sync cabinet to wine 1.1.11
Modified: trunk/reactos/dll/win32/cabinet/fci.c trunk/reactos/dll/win32/cabinet/fdi.c
Modified: trunk/reactos/dll/win32/cabinet/fci.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/cabinet/fci.c?rev... ============================================================================== --- trunk/reactos/dll/win32/cabinet/fci.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/cabinet/fci.c [iso-8859-1] Sat Dec 27 04:00:27 2008 @@ -462,7 +462,7 @@ case 2: ul |= (((ULONG)(*pb++)) << 8); case 1: - ul |= *pb++; + ul |= *pb; default: break; }
Modified: trunk/reactos/dll/win32/cabinet/fdi.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/cabinet/fdi.c?rev... ============================================================================== --- trunk/reactos/dll/win32/cabinet/fdi.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/cabinet/fdi.c [iso-8859-1] Sat Dec 27 04:00:27 2008 @@ -911,6 +911,7 @@ static int NONEfdi_decomp(int inlen, int outlen, fdi_decomp_state *decomp_state) { if (inlen != outlen) return DECR_ILLEGALDATA; + if (outlen > CAB_BLOCKMAX) return DECR_DATAFORMAT; memcpy(CAB(outbuf), CAB(inbuf), (size_t) inlen); return DECR_OK; } @@ -924,7 +925,7 @@
/* Go through linked list, freeing from the allocated (t[-1]) address. */ p = t; - while (p != (struct Ziphuft *)NULL) + while (p != NULL) { q = (--p)->v.t; PFDI_FREE(hfdi, p); @@ -969,7 +970,7 @@ } while (--i); if (ZIP(c)[0] == n) /* null input--all zero length codes */ { - *t = (struct Ziphuft *)NULL; + *t = NULL; *m = 0; return 0; } @@ -1017,8 +1018,8 @@ p = ZIP(v); /* grab values in bit order */ h = -1; /* no tables yet--level -1 */ w = l[-1] = 0; /* no bits decoded yet */ - ZIP(u)[0] = (struct Ziphuft *)NULL; /* just to keep compilers happy */ - q = (struct Ziphuft *)NULL; /* ditto */ + ZIP(u)[0] = NULL; /* just to keep compilers happy */ + q = NULL; /* ditto */ z = 0; /* ditto */
/* go through the bit lengths (k already is bits in shortest code) */ @@ -1060,7 +1061,7 @@ return 3; /* not enough memory */ } *t = q + 1; /* link to list for Ziphuft_free() */ - *(t = &(q->v.t)) = (struct Ziphuft *)NULL; + *(t = &(q->v.t)) = NULL; ZIP(u)[h] = ++q; /* table starts after link */
/* connect to last table, if there is one */ @@ -2258,6 +2259,56 @@ return DECR_OK; }
+static void free_decompression_temps(HFDI hfdi, struct fdi_folder *fol, + fdi_decomp_state *decomp_state) +{ + switch (fol->comp_type & cffoldCOMPTYPE_MASK) { + case cffoldCOMPTYPE_LZX: + if (LZX(window)) { + PFDI_FREE(hfdi, LZX(window)); + LZX(window) = NULL; + } + break; + case cffoldCOMPTYPE_QUANTUM: + if (QTM(window)) { + PFDI_FREE(hfdi, QTM(window)); + QTM(window) = NULL; + } + break; + } +} + +static void free_decompression_mem(HFDI hfdi, struct fdi_folder *fol, + fdi_decomp_state *decomp_state, struct fdi_file *file) +{ + while (decomp_state) { + fdi_decomp_state *prev_fds; + + PFDI_CLOSE(hfdi, CAB(cabhf)); + + /* free the storage remembered by mii */ + if (CAB(mii).nextname) PFDI_FREE(hfdi, CAB(mii).nextname); + if (CAB(mii).nextinfo) PFDI_FREE(hfdi, CAB(mii).nextinfo); + if (CAB(mii).prevname) PFDI_FREE(hfdi, CAB(mii).prevname); + if (CAB(mii).previnfo) PFDI_FREE(hfdi, CAB(mii).previnfo); + + while (CAB(firstfol)) { + fol = CAB(firstfol); + CAB(firstfol) = CAB(firstfol)->next; + PFDI_FREE(hfdi, fol); + } + while (CAB(firstfile)) { + file = CAB(firstfile); + if (file->filename) PFDI_FREE(hfdi, (void *)file->filename); + CAB(firstfile) = CAB(firstfile)->next; + PFDI_FREE(hfdi, file); + } + prev_fds = decomp_state; + decomp_state = CAB(next); + PFDI_FREE(hfdi, prev_fds); + } +} + /*********************************************************************** * FDICopy (CABINET.22) * @@ -2442,8 +2493,7 @@ cab_UBYTE buf[64]; struct fdi_folder *fol = NULL, *linkfol = NULL; struct fdi_file *file = NULL, *linkfile = NULL; - fdi_decomp_state _decomp_state; - fdi_decomp_state *decomp_state = &_decomp_state; + fdi_decomp_state *decomp_state;
TRACE("(hfdi == ^%p, pszCabinet == ^%p, pszCabPath == ^%p, flags == %0d, " "pfnfdin == ^%p, pfnfdid == ^%p, pvUser == ^%p)\n", @@ -2454,6 +2504,11 @@ return FALSE; }
+ if (!(decomp_state = PFDI_ALLOC(hfdi, sizeof(fdi_decomp_state)))) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } ZeroMemory(decomp_state, sizeof(fdi_decomp_state));
pathlen = (pszCabPath) ? strlen(pszCabPath) : 0; @@ -2777,7 +2832,7 @@
if (file->offset > CAB(offset)) { /* decode bytes and send them to /dev/null */ - switch ((err = fdi_decomp(file, 0, decomp_state, pszCabPath, pfnfdin, pvUser))) { + switch (fdi_decomp(file, 0, decomp_state, pszCabPath, pfnfdin, pvUser)) { case DECR_OK: break; case DECR_USERABORT: @@ -2839,99 +2894,18 @@ } }
- /* free decompression temps */ - switch (fol->comp_type & cffoldCOMPTYPE_MASK) { - case cffoldCOMPTYPE_LZX: - if (LZX(window)) { - PFDI_FREE(hfdi, LZX(window)); - LZX(window) = NULL; - } - break; - case cffoldCOMPTYPE_QUANTUM: - if (QTM(window)) { - PFDI_FREE(hfdi, QTM(window)); - QTM(window) = NULL; - } - break; - } - - while (decomp_state) { - fdi_decomp_state *prev_fds; - - PFDI_CLOSE(hfdi, CAB(cabhf)); - - /* free the storage remembered by mii */ - if (CAB(mii).nextname) PFDI_FREE(hfdi, CAB(mii).nextname); - if (CAB(mii).nextinfo) PFDI_FREE(hfdi, CAB(mii).nextinfo); - if (CAB(mii).prevname) PFDI_FREE(hfdi, CAB(mii).prevname); - if (CAB(mii).previnfo) PFDI_FREE(hfdi, CAB(mii).previnfo); - - while (CAB(firstfol)) { - fol = CAB(firstfol); - CAB(firstfol) = CAB(firstfol)->next; - PFDI_FREE(hfdi, fol); - } - while (CAB(firstfile)) { - file = CAB(firstfile); - if (file->filename) PFDI_FREE(hfdi, (void *)file->filename); - CAB(firstfile) = CAB(firstfile)->next; - PFDI_FREE(hfdi, file); - } - prev_fds = decomp_state; - decomp_state = CAB(next); - if (prev_fds != &_decomp_state) - PFDI_FREE(hfdi, prev_fds); - } + free_decompression_temps(hfdi, fol, decomp_state); + free_decompression_mem(hfdi, fol, decomp_state, file);
return TRUE;
bail_and_fail: /* here we free ram before error returns */
- /* free decompression temps */ - switch (fol->comp_type & cffoldCOMPTYPE_MASK) { - case cffoldCOMPTYPE_LZX: - if (LZX(window)) { - PFDI_FREE(hfdi, LZX(window)); - LZX(window) = NULL; - } - break; - case cffoldCOMPTYPE_QUANTUM: - if (QTM(window)) { - PFDI_FREE(hfdi, QTM(window)); - QTM(window) = NULL; - } - break; - } + free_decompression_temps(hfdi, fol, decomp_state);
if (filehf) PFDI_CLOSE(hfdi, filehf);
- while (decomp_state) { - fdi_decomp_state *prev_fds; - - PFDI_CLOSE(hfdi, CAB(cabhf)); - - /* free the storage remembered by mii */ - if (CAB(mii).nextname) PFDI_FREE(hfdi, CAB(mii).nextname); - if (CAB(mii).nextinfo) PFDI_FREE(hfdi, CAB(mii).nextinfo); - if (CAB(mii).prevname) PFDI_FREE(hfdi, CAB(mii).prevname); - if (CAB(mii).previnfo) PFDI_FREE(hfdi, CAB(mii).previnfo); - - while (CAB(firstfol)) { - fol = CAB(firstfol); - CAB(firstfol) = CAB(firstfol)->next; - PFDI_FREE(hfdi, fol); - } - while (CAB(firstfile)) { - file = CAB(firstfile); - if (file->filename) PFDI_FREE(hfdi, (void *)file->filename); - CAB(firstfile) = CAB(firstfile)->next; - PFDI_FREE(hfdi, file); - } - prev_fds = decomp_state; - decomp_state = CAB(next); - if (prev_fds != &_decomp_state) - PFDI_FREE(hfdi, prev_fds); - } + free_decompression_mem(hfdi, fol, decomp_state, file);
return FALSE; }