[2/3] cabinet: Read CAB size from the file header instead of calling FDI seek callback with SEEK_END.

Dmitry Timoshkov dmitry at baikal.ru
Tue Dec 24 22:24:58 CST 2013


SEEK_END is not supported by some callback implementations.
---
 dlls/cabinet/fdi.c       | 23 +++++------------------
 dlls/cabinet/tests/fdi.c |  5 +----
 2 files changed, 6 insertions(+), 22 deletions(-)

diff --git a/dlls/cabinet/fdi.c b/dlls/cabinet/fdi.c
index 2e39444..f9e6522 100644
--- a/dlls/cabinet/fdi.c
+++ b/dlls/cabinet/fdi.c
@@ -536,7 +536,7 @@ static BOOL FDI_read_entries(
         PMORE_ISCAB_INFO pmii)
 {
   int num_folders, num_files, header_resv, folder_resv = 0;
-  LONG base_offset, cabsize;
+  LONG cabsize;
   USHORT setid, cabidx, flags;
   cab_UBYTE buf[64], block_resv;
   char *prevname = NULL, *previnfo = NULL, *nextname = NULL, *nextinfo = NULL;
@@ -573,34 +573,21 @@ static BOOL FDI_read_entries(
    * -gmt
    */
 
-  /* get basic offset & size info */
-  base_offset = FDI_getoffset(fdi, hf);
-
-  if (fdi->seek(hf, 0, SEEK_END) == -1) {
-    if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
-    return FALSE;
-  }
-
-  cabsize = FDI_getoffset(fdi, hf);
-
-  if ((cabsize == -1) || (base_offset == -1) || 
-      ( fdi->seek(hf, base_offset, SEEK_SET) == -1 )) {
-    if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
-    return FALSE;
-  }
-
   /* read in the CFHEADER */
   if (fdi->read(hf, buf, cfhead_SIZEOF) != cfhead_SIZEOF) {
     if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
     return FALSE;
   }
-  
+
   /* check basic MSCF signature */
   if (EndGetI32(buf+cfhead_Signature) != 0x4643534d) {
     if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 );
     return FALSE;
   }
 
+  /* get the cabinet size */
+  cabsize = EndGetI32(buf+cfhead_CabinetSize);
+
   /* get the number of folders */
   num_folders = EndGetI16(buf+cfhead_NumFolders);
 
diff --git a/dlls/cabinet/tests/fdi.c b/dlls/cabinet/tests/fdi.c
index a2c305d..afae707 100644
--- a/dlls/cabinet/tests/fdi.c
+++ b/dlls/cabinet/tests/fdi.c
@@ -762,7 +762,6 @@ static LONG CDECL fdi_mem_seek(INT_PTR hf, LONG dist, int seektype)
 
     case SEEK_END:
     default:
-todo_wine
         ok(0, "seek: not expected type %d\n", seektype);
         return -1;
     }
@@ -879,18 +878,16 @@ static void test_FDICopy(void)
 
     memset(&info, 0, sizeof(info));
     ret = FDIIsCabinet(hfdi, fd, &info);
-todo_wine {
     ok(ret, "FDIIsCabinet error %d\n",  erf.erfOper);
     ok(info.cbCabinet == 0x59, "expected 0x59, got %#x\n", info.cbCabinet);
     ok(info.cFiles == 1, "expected 1, got %d\n", info.cFiles);
     ok(info.cFolders == 1, "expected 1, got %d\n", info.cFolders);
     ok(info.setID == 0x1225, "expected 0x1225, got %#x\n", info.setID);
     ok(info.iCabinet == 0x2013, "expected 0x2013, got %#x\n", info.iCabinet);
-}
+
     fdi_mem_close(fd);
 
     ret = FDICopy(hfdi, block, memory, 0, fdi_mem_notify, NULL, 0);
-todo_wine
     ok(ret, "FDICopy error %d\n", erf.erfOper);
 
     FDIDestroy(hfdi);
-- 
1.8.5.2




More information about the wine-patches mailing list