From 33e561f53cc510c6b5be3b4f1f3d2fbf8aa7486c Mon Sep 17 00:00:00 2001 From: Vitaly Perov Date: Thu, 24 Apr 2008 18:13:46 +0400 Subject: [PATCH] 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 468a68dcbd0..7e5edcd1207 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 bedcfa67f36..fc36c7876b5 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);