https://git.reactos.org/?p=reactos.git;a=commitdiff;h=469d4dbbab3ae55b87e71b583f234fdee0598db9

commit 469d4dbbab3ae55b87e71b583f234fdee0598db9
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Mon Sep 2 14:47:17 2024 +0300
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Fri Sep 20 14:08:13 2024 +0300

    [USETUP] Fix handling of 0 sized files in the cab
---
 base/setup/usetup/spapisup/cabinet.c | 76 ++++++++++++++++++++----------------
 1 file changed, 42 insertions(+), 34 deletions(-)

diff --git a/base/setup/usetup/spapisup/cabinet.c 
b/base/setup/usetup/spapisup/cabinet.c
index 414008163a5..52c35ed1888 100644
--- a/base/setup/usetup/spapisup/cabinet.c
+++ b/base/setup/usetup/spapisup/cabinet.c
@@ -1104,6 +1104,48 @@ CabinetExtractFile(
             }
         }
 
+        if (!ConvertDosDateTimeToFileTime(Search->File->FileDate,
+                                          Search->File->FileTime,
+                                          &FileTime))
+        {
+            DPRINT1("DosDateTimeToFileTime() failed\n");
+            Status = CAB_STATUS_CANNOT_WRITE;
+            goto CloseDestFile;
+        }
+
+        NtStatus = NtQueryInformationFile(DestFile,
+                                          &IoStatusBlock,
+                                          &FileBasic,
+                                          sizeof(FILE_BASIC_INFORMATION),
+                                          FileBasicInformation);
+        if (!NT_SUCCESS(NtStatus))
+        {
+            DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus);
+        }
+        else
+        {
+            memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME));
+
+            NtStatus = NtSetInformationFile(DestFile,
+                                            &IoStatusBlock,
+                                            &FileBasic,
+                                            sizeof(FILE_BASIC_INFORMATION),
+                                            FileBasicInformation);
+            if (!NT_SUCCESS(NtStatus))
+            {
+                DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus);
+            }
+        }
+
+        SetAttributesOnFile(Search->File, DestFile);
+
+        /* Nothing more to do for 0 sized files */
+        if (Search->File->FileSize == 0)
+        {
+            Status = CAB_STATUS_SUCCESS;
+            goto CloseDestFile;
+        }
+
         MaxDestFileSize.QuadPart = Search->File->FileSize;
         NtStatus = NtCreateSection(&DestFileSection,
                                    SECTION_ALL_ACCESS,
@@ -1139,40 +1181,6 @@ CabinetExtractFile(
         }
 
         CurrentDestBuffer = DestFileBuffer;
-        if (!ConvertDosDateTimeToFileTime(Search->File->FileDate,
-                                          Search->File->FileTime,
-                                          &FileTime))
-        {
-            DPRINT1("DosDateTimeToFileTime() failed\n");
-            Status = CAB_STATUS_CANNOT_WRITE;
-            goto UnmapDestFile;
-        }
-
-        NtStatus = NtQueryInformationFile(DestFile,
-                                          &IoStatusBlock,
-                                          &FileBasic,
-                                          sizeof(FILE_BASIC_INFORMATION),
-                                          FileBasicInformation);
-        if (!NT_SUCCESS(NtStatus))
-        {
-            DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus);
-        }
-        else
-        {
-            memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME));
-
-            NtStatus = NtSetInformationFile(DestFile,
-                                            &IoStatusBlock,
-                                            &FileBasic,
-                                            sizeof(FILE_BASIC_INFORMATION),
-                                            FileBasicInformation);
-            if (!NT_SUCCESS(NtStatus))
-            {
-                DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus);
-            }
-        }
-
-        SetAttributesOnFile(Search->File, DestFile);
     }
 
     /* Call extract event handler */

Reply via email to