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