[MMIXER] Fix additional data size initialization for different audio formats (#6753)
[reactos.git] / dll / shellext / zipfldr / zippidl.cpp
index 1e1eb9f..3f3b2cb 100644 (file)
@@ -2,19 +2,25 @@
  * PROJECT:     ReactOS Zip Shell Extension
  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
  * PURPOSE:     zip pidl handling
- * COPYRIGHT:   Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
+ * COPYRIGHT:   Copyright 2017-2019 Mark Jansen (mark.jansen@reactos.org)
+ *              Copyright 2023 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
  */
 
 #include "precomp.h"
 
-LPITEMIDLIST _ILCreate(ZipPidlType Type, LPCSTR lpString, unz_file_info64& info)
+LPITEMIDLIST _ILCreate(ZipPidlType Type, PCWSTR lpString, unz_file_info64& info)
 {
-    int cbData = sizeof(ZipPidlEntry) + strlen(lpString);
+    size_t cbData = sizeof(ZipPidlEntry) + wcslen(lpString) * sizeof(WCHAR);
+    if (cbData > MAXWORD)
+        return NULL;
+
     ZipPidlEntry* pidl = (ZipPidlEntry*)SHAlloc(cbData + sizeof(WORD));
     if (!pidl)
         return NULL;
 
-    pidl->cb = cbData;
+    ZeroMemory(pidl, cbData + sizeof(WORD));
+
+    pidl->cb = (WORD)cbData;
     pidl->MagicType = 'z';
     pidl->ZipType = Type;
 
@@ -23,16 +29,15 @@ LPITEMIDLIST _ILCreate(ZipPidlType Type, LPCSTR lpString, unz_file_info64& info)
         pidl->CompressedSize = info.compressed_size;
         pidl->UncompressedSize = info.uncompressed_size;
         pidl->DosDate = info.dosDate;
-        pidl->Password = info.flag & 1;
+        pidl->Password = info.flag & MINIZIP_PASSWORD_FLAG;
     }
 
-    strcpy(pidl->Name, lpString);
-    *(WORD*)((char*)pidl + cbData) = 0;
+    wcscpy(pidl->Name, lpString);
+    *(WORD*)((char*)pidl + cbData) = 0; // The end of an ITEMIDLIST
 
     return (LPITEMIDLIST)pidl;
 }
 
-
 const ZipPidlEntry* _ZipFromIL(LPCITEMIDLIST pidl)
 {
     const ZipPidlEntry* zipPidl = (const ZipPidlEntry*)pidl;