Vitaly Perov : cabinet: Fix for FDICopy with an empty cabinet file.
Alexandre Julliard
julliard at winehq.org
Fri Apr 25 08:11:21 CDT 2008
Module: wine
Branch: master
Commit: 33e561f53cc510c6b5be3b4f1f3d2fbf8aa7486c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=33e561f53cc510c6b5be3b4f1f3d2fbf8aa7486c
Author: Vitaly Perov <vitperov at etersoft.ru>
Date: Thu Apr 24 18:13:46 2008 +0400
cabinet: Fix for FDICopy with an empty cabinet file.
---
dlls/cabinet/fdi.c | 25 ++++++++++++++++---------
dlls/cabinet/tests/fdi.c | 5 +----
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/dlls/cabinet/fdi.c b/dlls/cabinet/fdi.c
index 468a68d..7e5edcd 100644
--- a/dlls/cabinet/fdi.c
+++ b/dlls/cabinet/fdi.c
@@ -562,9 +562,14 @@ static BOOL FDI_read_entries(
/* get the number of folders */
num_folders = EndGetI16(buf+cfhead_NumFolders);
- if (num_folders == 0) {
- /* PONDERME: is this really invalid? */
- WARN("weird cabinet detect failure: no folders in cabinet\n");
+ /* if num_folders is 0, it's correct cab, but empty */
+ /* if num_folders is 1, there is no folders in this cab */
+
+ /* get the number of files */
+ num_files = EndGetI16(buf+cfhead_NumFiles);
+ if (num_files && !num_folders) {
+ /* If there at least one file in the cabinet. num_folders is always >= 1 */
+ WARN("weird cabinet detect failure: cabinet is not empty, but num_folders = 0\n");
if (pmii) {
PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET;
PFDI_INT(hfdi)->perf->erfType = 0;
@@ -572,12 +577,9 @@ static BOOL FDI_read_entries(
}
return FALSE;
}
-
- /* get the number of files */
- num_files = EndGetI16(buf+cfhead_NumFiles);
- if (num_files == 0) {
- /* PONDERME: is this really invalid? */
- WARN("weird cabinet detect failure: no files in cabinet\n");
+ if (!num_files && num_folders) {
+ /* If cabinet consist of 0 files, num_folders must be 0 */
+ WARN("weird cabinet detect failure: no files in cabinet, but there are folders\n");
if (pmii) {
PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET;
PFDI_INT(hfdi)->perf->erfType = 0;
@@ -2834,6 +2836,11 @@ BOOL __cdecl FDICopy(
}
/* free decompression temps */
+ if (!fol) {
+ /* Empty cabinet */
+ PFDI_CLOSE(hfdi, cabhf);
+ return TRUE; /* empty, but correct */
+ }
switch (fol->comp_type & cffoldCOMPTYPE_MASK) {
case cffoldCOMPTYPE_LZX:
if (LZX(window)) {
diff --git a/dlls/cabinet/tests/fdi.c b/dlls/cabinet/tests/fdi.c
index bedcfa6..fc36c78 100644
--- a/dlls/cabinet/tests/fdi.c
+++ b/dlls/cabinet/tests/fdi.c
@@ -627,10 +627,7 @@ static void test_FDICopy(void)
cpuUNKNOWN, &erf);
ret=FDICopy(hfdi, name, path, 0, CopyProgress, NULL, 0);
- todo_wine
- {
- ok(ret, "Expected FDICopy to succeed\n");
- }
+ ok(ret, "Expected FDICopy to succeed\n");
FDIDestroy(hfdi);
DeleteFileA(name);
More information about the wine-cvs
mailing list