diff --git a/dlls/cabinet/fdi.c b/dlls/cabinet/fdi.c index 7e5edcd..468a68d 100644 --- a/dlls/cabinet/fdi.c +++ b/dlls/cabinet/fdi.c @@ -562,14 +562,9 @@ static BOOL FDI_read_entries( /* get the number of folders */ num_folders = EndGetI16(buf+cfhead_NumFolders); - /* 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 (num_folders == 0) { + /* PONDERME: is this really invalid? */ + WARN("weird cabinet detect failure: no folders in cabinet\n"); if (pmii) { PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; PFDI_INT(hfdi)->perf->erfType = 0; @@ -577,9 +572,12 @@ static BOOL FDI_read_entries( } return FALSE; } - 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"); + + /* 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 (pmii) { PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; PFDI_INT(hfdi)->perf->erfType = 0; @@ -2836,11 +2834,6 @@ 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 fc36c78..f90b6f0 100644 --- a/dlls/cabinet/tests/fdi.c +++ b/dlls/cabinet/tests/fdi.c @@ -626,8 +626,15 @@ static void test_FDICopy(void) fdi_write, fdi_close, fdi_seek, cpuUNKNOWN, &erf); - ret=FDICopy(hfdi, name, path, 0, CopyProgress, NULL, 0); - ok(ret, "Expected FDICopy to succeed\n"); + /* cabinet with no files or folders */ + SetLastError(0xdeadbeef); + ret = FDICopy(hfdi, name, path, 0, CopyProgress, NULL, 0); + ok(ret == FALSE, "Expected FALSE, got %d\n", ret); + todo_wine + { + ok(GetLastError() == ERROR_INVALID_HANDLE, + "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); + } FDIDestroy(hfdi); DeleteFileA(name); -- 1.5.4.3