diff options
author | elfmz <fenix1905@tut.by> | 2022-09-04 01:04:08 +0300 |
---|---|---|
committer | elfmz <fenix1905@tut.by> | 2022-09-04 01:04:08 +0300 |
commit | e03c2c6953bd116edaf97c749532a5823b20c3da (patch) | |
tree | 82962aae61b98905a51ead0054688805bef82acd | |
parent | 7dc09d4938cb9ac34387253ce2529caa4411e398 (diff) |
fix problems handling filenames of near to 255 characters (fix #1343)
-rw-r--r-- | WinPort/src/APIFiles.cpp | 4 | ||||
-rw-r--r-- | far2l/src/farwinapi.cpp | 3 | ||||
-rw-r--r-- | far2l/src/plug/wrap.cpp | 30 | ||||
-rw-r--r-- | inside/src/PluginImpl.cpp | 34 | ||||
-rw-r--r-- | inside/src/elf/PluginImplELF.cpp | 4 | ||||
-rw-r--r-- | multiarc/src/ArcPlg.cpp | 5 | ||||
-rw-r--r-- | multiarc/src/MultiArc.hpp | 6 | ||||
-rw-r--r-- | multiarc/src/arcread.cpp | 138 | ||||
-rw-r--r-- | multiarc/src/fmt.hpp | 36 | ||||
-rw-r--r-- | multiarc/src/formats/7z/7z.cpp | 22 | ||||
-rw-r--r-- | multiarc/src/formats/ace/ace.cpp | 24 | ||||
-rw-r--r-- | multiarc/src/formats/all.h | 24 | ||||
-rw-r--r-- | multiarc/src/formats/arc/arc.cpp | 19 | ||||
-rw-r--r-- | multiarc/src/formats/arj/arj.cpp | 22 | ||||
-rw-r--r-- | multiarc/src/formats/cab/cab.cpp | 17 | ||||
-rw-r--r-- | multiarc/src/formats/custom/custom.cpp | 88 | ||||
-rw-r--r-- | multiarc/src/formats/ha/ha.cpp | 18 | ||||
-rw-r--r-- | multiarc/src/formats/libarch/libarch.cpp | 29 | ||||
-rw-r--r-- | multiarc/src/formats/lzh/lzh.cpp | 26 | ||||
-rw-r--r-- | multiarc/src/formats/rar/rar.cpp | 46 | ||||
-rw-r--r-- | multiarc/src/formats/targz/targz.cpp | 67 | ||||
-rw-r--r-- | multiarc/src/formats/zip/zip.cpp | 93 | ||||
-rw-r--r-- | utils/include/utils.h | 33 |
23 files changed, 437 insertions, 351 deletions
diff --git a/WinPort/src/APIFiles.cpp b/WinPort/src/APIFiles.cpp index 65b3aa77..3836b79d 100644 --- a/WinPort/src/APIFiles.cpp +++ b/WinPort/src/APIFiles.cpp @@ -766,7 +766,7 @@ extern "C" } MB2Wide(name, _tmp.wide_name); - wcsncpy(wfd->cFileName, _tmp.wide_name.c_str(), MAX_NAME - 1); + wcsncpy(wfd->cFileName, _tmp.wide_name.c_str(), MAX_NAME); const DWORD attrs = wfd->dwFileAttributes; if ((attrs & FILE_ATTRIBUTE_DIRECTORY) != 0) { @@ -870,7 +870,7 @@ extern "C" } LPCWSTR last_slash = wcsrchr(lpFileName, GOOD_SLASH); - wcsncpy(lpFindFileData->cFileName, last_slash ? last_slash + 1 : lpFileName, MAX_NAME - 1); + wcsncpy(lpFindFileData->cFileName, last_slash ? last_slash + 1 : lpFileName, MAX_NAME); return (HANDLE)&g_unix_found_file_dummy; } diff --git a/far2l/src/farwinapi.cpp b/far2l/src/farwinapi.cpp index 724698b4..a618a6da 100644 --- a/far2l/src/farwinapi.cpp +++ b/far2l/src/farwinapi.cpp @@ -68,7 +68,8 @@ static void TranslateFindFile(const WIN32_FIND_DATA &wfd, FAR_FIND_DATA_EX& Find FindData.dwUnixMode = wfd.dwUnixMode; FindData.nHardLinks = wfd.nHardLinks; FindData.nBlockSize = wfd.nBlockSize; - FindData.strFileName = wfd.cFileName; + + FindData.strFileName.Copy(wfd.cFileName, wcsnlen(wfd.cFileName, ARRAYSIZE(wfd.cFileName))); } FindFile::FindFile(LPCWSTR Object, bool ScanSymLink, DWORD WinPortFindFlags) : diff --git a/far2l/src/plug/wrap.cpp b/far2l/src/plug/wrap.cpp index 2d6fa4df..aeee159d 100644 --- a/far2l/src/plug/wrap.cpp +++ b/far2l/src/plug/wrap.cpp @@ -42,7 +42,7 @@ static int PZ_to_PWZ(const char *src, wchar_t *dst, int lendst) } -const char *FirstSlashA(const char *String) +static const char *FirstSlashA(const char *String) { do { @@ -68,7 +68,7 @@ bool FirstSlashA(const char *String,size_t &pos) return Ret; } -const char *LastSlashA(const char *String) +static const char *LastSlashA(const char *String) { const char *Start = String; @@ -81,7 +81,7 @@ const char *LastSlashA(const char *String) return IsSlashA(*String)?String:nullptr; } -bool LastSlashA(const char *String,size_t &pos) +static bool LastSlashA(const char *String,size_t &pos) { bool Ret=false; const char *Ptr=LastSlashA(String); @@ -95,7 +95,7 @@ bool LastSlashA(const char *String,size_t &pos) return Ret; } -void AnsiToUnicodeBin(const char *lpszAnsiString, wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8) +static void AnsiToUnicodeBin(const char *lpszAnsiString, wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8) { if (lpszAnsiString && lpwszUnicodeString && nLength) { @@ -105,22 +105,26 @@ void AnsiToUnicodeBin(const char *lpszAnsiString, wchar_t *lpwszUnicodeString, i } } -wchar_t *AnsiToUnicodeBin(const char *lpszAnsiString, int nLength, UINT CodePage=CP_UTF8) +static wchar_t *AnsiToUnicodeBin(const char *lpszAnsiString, int nLength, UINT CodePage=CP_UTF8) { wchar_t *lpResult = (wchar_t*)malloc(nLength*sizeof(wchar_t)); AnsiToUnicodeBin(lpszAnsiString,lpResult,nLength,CodePage); return lpResult; } -wchar_t *AnsiToUnicode(const char *lpszAnsiString, UINT CodePage=CP_UTF8) +static wchar_t *AnsiToUnicode(const char *lpszAnsiString, int nMaxLength = -1, UINT CodePage = CP_UTF8) { if (!lpszAnsiString) return nullptr; - return AnsiToUnicodeBin(lpszAnsiString,(int)strlen(lpszAnsiString)+1,CodePage); + int nLength = (nMaxLength == -1) ? strlen(lpszAnsiString) : (int)strnlen(lpszAnsiString, nMaxLength); + + wchar_t *out = AnsiToUnicodeBin(lpszAnsiString, nLength+1, CodePage); + out[nLength] = 0; + return out; } -char *UnicodeToAnsiBin(const wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8) +static char *UnicodeToAnsiBin(const wchar_t *lpwszUnicodeString, int nLength, UINT CodePage=CP_UTF8) { /* $ 06.01.2008 TS ! Увеличил размер выделяемой под строку памяти на 1 байт для нормальной @@ -163,7 +167,7 @@ char *UnicodeToAnsiBin(const wchar_t *lpwszUnicodeString, int nLength, UINT Code return lpResult; } -char *UnicodeToAnsi(const wchar_t *lpwszUnicodeString, UINT CodePage=CP_UTF8) +static char *UnicodeToAnsi(const wchar_t *lpwszUnicodeString, UINT CodePage=CP_UTF8) { if (!lpwszUnicodeString) return nullptr; @@ -171,7 +175,7 @@ char *UnicodeToAnsi(const wchar_t *lpwszUnicodeString, UINT CodePage=CP_UTF8) return UnicodeToAnsiBin(lpwszUnicodeString,StrLength(lpwszUnicodeString)+1,CodePage); } -wchar_t **ArrayAnsiToUnicode(char ** lpaszAnsiString, int iCount) +static wchar_t **ArrayAnsiToUnicode(char ** lpaszAnsiString, int iCount) { wchar_t** lpaResult = nullptr; @@ -193,7 +197,7 @@ wchar_t **ArrayAnsiToUnicode(char ** lpaszAnsiString, int iCount) return lpaResult; } -void FreeArrayUnicode(wchar_t ** lpawszUnicodeString) +static void FreeArrayUnicode(wchar_t ** lpawszUnicodeString) { if (lpawszUnicodeString) { @@ -206,7 +210,7 @@ void FreeArrayUnicode(wchar_t ** lpawszUnicodeString) } } -DWORD OldKeyToKey(DWORD dOldKey) +static DWORD OldKeyToKey(DWORD dOldKey) { if (dOldKey&0x100) { @@ -416,7 +420,7 @@ void ConvertPanelItemA(const oldfar::PluginPanelItem *PanelItemA, PluginPanelIte (*PanelItemW)[i].Flags = PanelItemA[i].Flags; (*PanelItemW)[i].NumberOfLinks = PanelItemA[i].NumberOfLinks; (*PanelItemW)[i].CRC32 = PanelItemA[i].CRC32; - (*PanelItemW)[i].FindData.lpwszFileName = AnsiToUnicode(PanelItemA[i].FindData.cFileName); + (*PanelItemW)[i].FindData.lpwszFileName = AnsiToUnicode(PanelItemA[i].FindData.cFileName, ARRAYSIZE(PanelItemA[i].FindData.cFileName)); if (PanelItemA[i].Description) (*PanelItemW)[i].Description = AnsiToUnicode(PanelItemA[i].Description); diff --git a/inside/src/PluginImpl.cpp b/inside/src/PluginImpl.cpp index 2c678dd6..7b706c92 100644 --- a/inside/src/PluginImpl.cpp +++ b/inside/src/PluginImpl.cpp @@ -1,11 +1,13 @@ #include "Globals.h" #include "PluginImpl.h" +#include <utils.h> bool PluginImpl::AddUnsized(FP_SizeItemList &il, const char *name, DWORD attrs) { - PluginPanelItem tmp = {}; - strncpy(tmp.FindData.cFileName, name, sizeof(tmp.FindData.cFileName) - 1 ); + PluginPanelItem tmp; + ZeroFill(tmp); // ensure zeroed padding after tmp.FindData.cFileName + strncpy(tmp.FindData.cFileName, name, ARRAYSIZE(tmp.FindData.cFileName)); tmp.FindData.dwFileAttributes = attrs; tmp.Description = tmp.FindData.cFileName; return il.Add(&tmp); @@ -28,7 +30,8 @@ int PluginImpl::GetFindData(PluginPanelItem **pPanelItem, int *pItemsNumber, int if(!IS_SILENT(OpMode)) { - PluginPanelItem tmp = {}; + PluginPanelItem tmp; + ZeroFill(tmp); // ensure zeroed padding after tmp.FindData.cFileName strcpy(tmp.FindData.cFileName, ".."); tmp.FindData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; @@ -114,13 +117,14 @@ int PluginImpl::GetFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int if (!data_path.empty() && data_path[data_path.size() - 1] != '/') { data_path+= '/'; } - data_path+= PanelItem[i].FindData.cFileName; - + + const size_t name_ofs = data_path.size(); + StrAppendArray(data_path, PanelItem[i].FindData.cFileName); uint64_t len = PanelItem[i].FindData.nFileSize; - bool rv = OnGetFile(PanelItem[i].FindData.cFileName, data_path.c_str(), len); + bool rv = OnGetFile(data_path.c_str() + name_ofs, data_path.c_str(), len); fprintf(stderr, "Inside::GetFiles[%i]: %s '%s'\n", - i, rv ? "OK" : "ERROR", PanelItem[i].FindData.cFileName); + i, rv ? "OK" : "ERROR", data_path.c_str() + name_ofs); } return out; @@ -137,16 +141,18 @@ int PluginImpl::PutFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, int sdc_getcwd(cd, sizeof(cd) - 1); std::string data_path; for (int i = 0; i < ItemsNumber; ++i) { + size_t name_ofs = 0; if (PanelItem[i].FindData.cFileName[0] != '/') { data_path = cd; data_path+= '/'; - data_path+= PanelItem[i].FindData.cFileName; + name_ofs = data_path.size(); + StrAppendArray(data_path, PanelItem[i].FindData.cFileName); } else - data_path = PanelItem[i].FindData.cFileName; + StrAssignArray(data_path, PanelItem[i].FindData.cFileName); - bool rv = OnPutFile(PanelItem[i].FindData.cFileName, data_path.c_str()); + bool rv = OnPutFile(data_path.c_str() + name_ofs, data_path.c_str()); fprintf(stderr, "Inside::PutFiles[%i]: %s '%s'\n", - i, rv ? "OK" : "ERROR", PanelItem[i].FindData.cFileName); + i, rv ? "OK" : "ERROR", data_path.c_str() + name_ofs); if (!rv) out = FALSE; @@ -160,10 +166,12 @@ int PluginImpl::DeleteFiles(struct PluginPanelItem *PanelItem, int ItemsNumber, if (ItemsNumber == 0 ) return FALSE; + std::string safe_name; for (int i = 0; i < ItemsNumber; ++i) { - bool rv = OnDeleteFile(PanelItem[i].FindData.cFileName); + StrAssignArray(safe_name, PanelItem[i].FindData.cFileName); + bool rv = OnDeleteFile(safe_name.c_str()); fprintf(stderr, "Inside::DeleteFiles[%i]: %s '%s'\n", - i, rv ? "OK" : "ERROR", PanelItem[i].FindData.cFileName); + i, rv ? "OK" : "ERROR", safe_name.c_str()); } return TRUE; diff --git a/inside/src/elf/PluginImplELF.cpp b/inside/src/elf/PluginImplELF.cpp index 96864e11..7fb3965e 100644 --- a/inside/src/elf/PluginImplELF.cpp +++ b/inside/src/elf/PluginImplELF.cpp @@ -2,6 +2,7 @@ #include "PluginImplELF.h" #include "Dumper.h" #include "ELFInfo.h" +#include <utils.h> #define STR_DISASM "Disassembly" @@ -11,7 +12,8 @@ static bool AddBinFile(FP_SizeItemList &il, const char *prefix, uint64_t ofs, uint64_t len) { - PluginPanelItem tmp = {}; + PluginPanelItem tmp; + ZeroFill(tmp); // ensure zeroed padding after tmp.FindData.cFileName snprintf(tmp.FindData.cFileName, sizeof(tmp.FindData.cFileName) - 1, "%s@%llx.bin", prefix, (unsigned long long)ofs); tmp.FindData.nFileSize = len; diff --git a/multiarc/src/ArcPlg.cpp b/multiarc/src/ArcPlg.cpp index 41cb9bc0..c4357f36 100644 --- a/multiarc/src/ArcPlg.cpp +++ b/multiarc/src/ArcPlg.cpp @@ -145,11 +145,10 @@ BOOL ArcPlugins::OpenArchive(int PluginNumber, const char *Name,int *Type,bool S return FALSE; } -int ArcPlugins::GetArcItem(int PluginNumber,struct PluginPanelItem *Item, - struct ArcItemInfo *Info) +int ArcPlugins::GetArcItem(int PluginNumber, struct ArcItemInfo *Info) { if ((DWORD)PluginNumber < PluginsData.size() && PluginsData[PluginNumber].pGetArcItem) - return PluginsData[PluginNumber].pGetArcItem(Item,Info); + return PluginsData[PluginNumber].pGetArcItem(Info); return FALSE; } diff --git a/multiarc/src/MultiArc.hpp b/multiarc/src/MultiArc.hpp index 40a36f08..f8361572 100644 --- a/multiarc/src/MultiArc.hpp +++ b/multiarc/src/MultiArc.hpp @@ -66,7 +66,7 @@ struct ArcItemUserData{ typedef DWORD (WINAPI *PLUGINLOADFORMATMODULE)(const char *ModuleName); typedef BOOL (WINAPI *PLUGINISARCHIVE)(const char *Name,const unsigned char *Data,int DataSize); typedef BOOL (WINAPI *PLUGINOPENARCHIVE)(const char *Name,int *Type,bool Silent); -typedef int (WINAPI *PLUGINGETARCITEM)(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +typedef int (WINAPI *PLUGINGETARCITEM)(struct ArcItemInfo *Info); typedef BOOL (WINAPI *PLUGINCLOSEARCHIVE)(struct ArcInfo *Info); typedef BOOL (WINAPI *PLUGINGETFORMATNAME)(int Type,char *FormatName,char *DefaultExt); typedef BOOL (WINAPI *PLUGINGETDEFAULTCOMMANDS)(int Type,int Command,char *Dest); @@ -114,7 +114,7 @@ class ArcPlugins int IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL IsArchive(int ArcPluginNumber, const char *Name,const unsigned char *Data,int DataSize, DWORD* SFXSize); BOOL OpenArchive(int PluginNumber,const char *Name,int *Type,bool Silent); - int GetArcItem(int PluginNumber,struct PluginPanelItem *Item,struct ArcItemInfo *Info); + int GetArcItem(int PluginNumber,struct ArcItemInfo *Info); void CloseArchive(int PluginNumber,struct ArcInfo *Info); BOOL GetFormatName(int PluginNumber,int Type,char *FormatName,char *DefaultExt); BOOL GetDefaultCommands(int PluginNumber,int Type,int Command,char *Dest); @@ -130,7 +130,7 @@ class PluginClass private: char ArcName[NM]; char CurDir[NM]; - std::vector<PluginPanelItem> ArcData; + std::vector<ArcItemInfo> ArcData; struct stat ArcStat {}; int ArcPluginNumber; int ArcPluginType; diff --git a/multiarc/src/arcread.cpp b/multiarc/src/arcread.cpp index efa1076f..065dfb73 100644 --- a/multiarc/src/arcread.cpp +++ b/multiarc/src/arcread.cpp @@ -1,4 +1,5 @@ #include <fcntl.h> +#include <assert.h> #include "MultiArc.hpp" #include "marclng.hpp" @@ -7,11 +8,10 @@ PluginClass::PluginClass(int ArcPluginNumber) *ArcName=0; *CurDir=0; PluginClass::ArcPluginNumber=ArcPluginNumber; - memset(&CurArcInfo,0,sizeof(struct ArcInfo)); - memset(&ItemsInfo,0,sizeof(ItemsInfo)); DizPresent=FALSE; bGOPIFirstCall=true; *farlang=0; + ZeroFill(CurArcInfo); } @@ -24,9 +24,6 @@ void PluginClass::FreeArcData() { for (auto &I : ArcData) { - if (I.Description!=NULL) - delete[] I.Description; - if(I.UserData && (I.Flags & PPIF_USERDATA)) { struct ArcItemUserData *aud=(struct ArcItemUserData*)I.UserData; @@ -54,6 +51,14 @@ int PluginClass::PreReadArchive(const char *Name) return TRUE; } + +static void SanitizeString(std::string &s) +{ + while (!s.empty() && !s.back()) { + s.pop_back(); + } +} + int PluginClass::ReadArchive(const char *Name,int OpMode) { bGOPIFirstCall=true; @@ -66,8 +71,8 @@ int PluginClass::ReadArchive(const char *Name,int OpMode) if (!ArcPlugin->OpenArchive(ArcPluginNumber,Name,&ArcPluginType,(OpMode & OPM_SILENT)!=0)) return FALSE; - memset(&ItemsInfo,0,sizeof(ItemsInfo)); - memset(&CurArcInfo,0,sizeof(CurArcInfo)); + ItemsInfo = ArcItemInfo{}; + ZeroFill(CurArcInfo); TotalSize=PackedSize=0; HANDLE hScreen=Info.SaveScreen(0,0,-1,-1); @@ -85,11 +90,12 @@ int PluginClass::ReadArchive(const char *Name,int OpMode) break; } - struct PluginPanelItem &CurArcData = ArcData.back(); - struct ArcItemInfo CurItemInfo; - memset(&CurArcData,0,sizeof(CurArcData)); - memset(&CurItemInfo,0,sizeof(CurItemInfo)); - GetItemCode=ArcPlugin->GetArcItem(ArcPluginNumber,&CurArcData,&CurItemInfo); + auto &CurItemInfo = ArcData.back(); + GetItemCode=ArcPlugin->GetArcItem(ArcPluginNumber,&CurItemInfo); + SanitizeString(CurItemInfo.PathName); + SanitizeString(CurItemInfo.HostOS); + SanitizeString(CurItemInfo.Description); + if (GetItemCode!=GETARC_SUCCESS) { @@ -124,16 +130,16 @@ int PluginClass::ReadArchive(const char *Name,int OpMode) } } - if (*CurItemInfo.Description) + if (!CurItemInfo.Description.empty()) { - CurArcData.Description=new char[strlen(CurItemInfo.Description)+1]; - if (CurArcData.Description) - strcpy(CurArcData.Description,CurItemInfo.Description); +// CurArcData.Description=new char[strlen(CurItemInfo.Description)+1]; +// if (CurArcData.Description) +// strcpy(CurArcData.Description,CurItemInfo.Description); DizPresent=TRUE; } - if (strcmp(ItemsInfo.HostOS,CurItemInfo.HostOS)!=0) - strcpy(ItemsInfo.HostOS,(*ItemsInfo.HostOS?GetMsg(MSeveralOS):CurItemInfo.HostOS)); + if (ItemsInfo.HostOS != CurItemInfo.HostOS) + ItemsInfo.HostOS = (ItemsInfo.HostOS.empty() ? CurItemInfo.HostOS : GetMsg(MSeveralOS)); if (ItemsInfo.Codepage <= 0) ItemsInfo.Codepage=CurItemInfo.Codepage; @@ -143,7 +149,7 @@ int PluginClass::ReadArchive(const char *Name,int OpMode) ItemsInfo.Encrypted|=CurItemInfo.Encrypted; if (CurItemInfo.Encrypted) - CurArcData.Flags|=F_ENCRYPTED; + CurItemInfo.Flags|=F_ENCRYPTED; if (CurItemInfo.DictSize>ItemsInfo.DictSize) ItemsInfo.DictSize=CurItemInfo.DictSize; @@ -151,16 +157,16 @@ int PluginClass::ReadArchive(const char *Name,int OpMode) if (CurItemInfo.UnpVer>ItemsInfo.UnpVer) ItemsInfo.UnpVer=CurItemInfo.UnpVer; - CurArcData.NumberOfLinks=1; + CurItemInfo.NumberOfLinks=1; - NormalizePath(CurArcData.FindData.cFileName,CurArcData.FindData.cFileName); - //fprintf(stderr, "PATH: %s\n", CurArcData.FindData.cFileName); + NormalizePath(CurItemInfo.PathName); + //fprintf(stderr, "PATH: %s\n", CurItemInfo.PathName.c_str()); struct ArcItemUserData *aud=NULL; char *Pref=NULL; - char *NamePtr=CurArcData.FindData.cFileName; - char *EndPos=NamePtr; + const char *NamePtr=CurItemInfo.PathName.c_str(); + const char *EndPos=NamePtr; while(*EndPos == '.') EndPos++; if(*EndPos == '/') while(*EndPos == '/') EndPos++; @@ -176,37 +182,38 @@ int PluginClass::ReadArchive(const char *Name,int OpMode) } } - if(CurArcData.UserData || Pref || CurItemInfo.Codepage > 0) + if(CurItemInfo.UserData || Pref || CurItemInfo.Codepage > 0) { if((aud=(struct ArcItemUserData*)malloc(sizeof(struct ArcItemUserData))) != NULL) { - CurArcData.Flags |= PPIF_USERDATA; + CurItemInfo.Flags |= PPIF_USERDATA; aud->SizeStruct=sizeof(struct ArcItemUserData); aud->Prefix=Pref; - aud->LinkName=CurArcData.UserData?(char *)CurArcData.UserData:NULL; + aud->LinkName=CurItemInfo.UserData?(char *)CurItemInfo.UserData:NULL; aud->Codepage=CurItemInfo.Codepage; - CurArcData.UserData=(DWORD_PTR)aud; + CurItemInfo.UserData=(DWORD_PTR)aud; } else - CurArcData.UserData=0; + CurItemInfo.UserData=0; } - if(!CurArcData.UserData && Pref) + if(!CurItemInfo.UserData && Pref) free(Pref); - if (EndPos!=CurArcData.FindData.cFileName) - memmove(CurArcData.FindData.cFileName,EndPos,strlen(EndPos)+1); - - int Length=strlen(CurArcData.FindData.cFileName); + if (EndPos!=NamePtr) + { + assert(size_t(EndPos - NamePtr) <= CurItemInfo.PathName.size()); + CurItemInfo.PathName.erase(0, EndPos - NamePtr); + } - if (Length>0 && (CurArcData.FindData.cFileName[Length-1]=='/')) + if (!CurItemInfo.PathName.empty() && CurItemInfo.PathName.back() == '/') { - CurArcData.FindData.cFileName[Length-1]=0; - CurArcData.FindData.dwFileAttributes|=FILE_ATTRIBUTE_DIRECTORY; + CurItemInfo.PathName.pop_back(); + CurItemInfo.dwFileAttributes|=FILE_ATTRIBUTE_DIRECTORY; } - TotalSize+=CurArcData.FindData.nFileSize; - PackedSize+=CurArcData.FindData.nPhysicalSize; + TotalSize+=CurItemInfo.nFileSize; + PackedSize+=CurItemInfo.nPhysicalSize; } Info.RestoreScreen(NULL); @@ -278,6 +285,24 @@ bool PluginClass::EnsureFindDataUpToDate(int OpMode) return ReadArcOK; } +static void ArcItemInfo2PluginPanelItem(const ArcItemInfo &aai, PluginPanelItem &ppi) +{ + ZeroFill(ppi); + ppi.FindData.ftCreationTime = aai.ftCreationTime; + ppi.FindData.ftLastAccessTime = aai.ftLastAccessTime; + ppi.FindData.ftLastWriteTime = aai.ftLastWriteTime; + ppi.FindData.nPhysicalSize = aai.nPhysicalSize; + ppi.FindData.nFileSize = aai.nFileSize; + ppi.FindData.dwFileAttributes = aai.dwFileAttributes; + ppi.FindData.dwUnixMode = aai.dwUnixMode; + strncpy(ppi.FindData.cFileName, aai.PathName.c_str(), ARRAYSIZE(ppi.FindData.cFileName)); + ppi.UserData = aai.UserData; + ppi.Flags = aai.Flags; + ppi.NumberOfLinks = aai.NumberOfLinks; + ppi.CRC32 = aai.CRC32; + ppi.Description = aai.Description.empty() ? nullptr : (char *)aai.Description.c_str(); +} + int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int OpMode) { if (!EnsureFindDataUpToDate(OpMode)) @@ -289,8 +314,8 @@ int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int int AlocatedItemsNumber=0; for (const auto &I : ArcData) { - auto CurItem = I; - const char *Name = I.FindData.cFileName; + ArcItemInfo CurItem = I; + const char *Name = I.PathName.c_str(); BOOL Append=FALSE; if (Name[0]==GOOD_SLASH) @@ -308,26 +333,28 @@ int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int if (Slash != NULL) { NameLen = Slash - StartName; - CurItem.FindData.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY; - CurItem.FindData.nFileSize=0; - CurItem.FindData.nPhysicalSize=0; + CurItem.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY; + CurItem.nFileSize=0; + CurItem.nPhysicalSize=0; } else NameLen = strlen(StartName); - if (NameLen >= sizeof(CurItem.FindData.cFileName)) - NameLen = sizeof(CurItem.FindData.cFileName) - 1; - memcpy(CurItem.FindData.cFileName,StartName,NameLen); - CurItem.FindData.cFileName[NameLen] = 0; + if (StartName != Name) + { + assert(size_t(StartName - Name) <= I.PathName.size()); + CurItem.PathName.erase(0, StartName - Name); + } + CurItem.PathName.resize(NameLen); Append=TRUE; - if (CurItem.FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + if (CurItem.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { for (int J=0; J < *pItemsNumber; J++) if ((*pPanelItem)[J].FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - if (strcmp(CurItem.FindData.cFileName,(*pPanelItem)[J].FindData.cFileName)==0) + if (StrMatchArray(CurItem.PathName, (*pPanelItem)[J].FindData.cFileName)) { Append=FALSE; - (*pPanelItem)[J].FindData.dwFileAttributes |= CurItem.FindData.dwFileAttributes; + (*pPanelItem)[J].FindData.dwFileAttributes |= CurItem.dwFileAttributes; } } } @@ -345,7 +372,8 @@ int PluginClass::GetFindData(PluginPanelItem **pPanelItem,int *pItemsNumber,int *pPanelItem=NewPanelItem; } - NewPanelItem[*pItemsNumber]=CurItem; + ArcItemInfo2PluginPanelItem(CurItem, NewPanelItem[*pItemsNumber]); + //NewPanelItem[*pItemsNumber]=CurItem; (*pItemsNumber)++; } @@ -392,7 +420,7 @@ int PluginClass::SetDirectory(const char *Dir,int OpMode) for (const auto &I : ArcData) { - const char *CurName=I.FindData.cFileName; + const char *CurName=I.PathName.c_str(); if (strlen(CurName)>=CurDirLength+NewDirLength && strncmp(CurName+CurDirLength,Dir,NewDirLength)==0) { @@ -475,8 +503,8 @@ void PluginClass::GetOpenPluginInfo(struct OpenPluginInfo *Info) FSF.sprintf(InfoLines[1].Data+strlen(InfoLines[1].Data)," %d.%d", ItemsInfo.UnpVer/256,ItemsInfo.UnpVer%256); - if (*ItemsInfo.HostOS) - FSF.sprintf(InfoLines[1].Data+strlen(InfoLines[1].Data),"/%s",ItemsInfo.HostOS); + if (!ItemsInfo.HostOS.empty()) + FSF.sprintf(InfoLines[1].Data+strlen(InfoLines[1].Data),"/%s",ItemsInfo.HostOS.c_str()); strcpy(InfoLines[2].Text,GetMsg(MInfoArcType)); diff --git a/multiarc/src/fmt.hpp b/multiarc/src/fmt.hpp index 46a01751..7e7c5c3d 100644 --- a/multiarc/src/fmt.hpp +++ b/multiarc/src/fmt.hpp @@ -26,6 +26,8 @@ #endif #include "../../WinPort/WinCompat.h" +#include <string> +#include <utils.h> enum GETARC_CODE { @@ -38,15 +40,29 @@ enum GETARC_CODE struct ArcItemInfo { - char HostOS[32]; - char Description[256]; - int Solid; - int Comment; - int Encrypted; - int DictSize; - int UnpVer; - int Chapter; - int Codepage; + int Solid{}; + int Comment{}; + int Encrypted{}; + int DictSize{}; + int UnpVer{}; + int Chapter{}; + int Codepage{}; + + FILETIME ftCreationTime{}; + FILETIME ftLastAccessTime{}; + FILETIME ftLastWriteTime{}; + DWORD64 nPhysicalSize{}; + DWORD64 nFileSize{}; + DWORD dwFileAttributes{}; + DWORD dwUnixMode{}; + DWORD_PTR UserData{}; + DWORD Flags{}; + DWORD NumberOfLinks{}; + DWORD CRC32{}; + + std::string PathName; + std::string HostOS; + std::string Description; }; enum ARCINFO_FLAGS @@ -80,7 +96,7 @@ void WINAPI _export SetFarInfo(const struct PluginStartupInfo *Info); BOOL WINAPI _export IsArchive(const char *Name,const unsigned char *Data,int DataSize); DWORD WINAPI _export GetSFXPos(void); BOOL WINAPI _export OpenArchive(const char *Name,int *TypeArc); -int WINAPI _export GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export CloseArchive(struct ArcInfo *Info); BOOL WINAPI _export GetFormatName(int TypeArc,char *FormatName,char *DefaultExt); BOOL WINAPI _export GetDefaultCommands(int TypeArc,int Command,char *Dest); diff --git a/multiarc/src/formats/7z/7z.cpp b/multiarc/src/formats/7z/7z.cpp index 650520b8..0f9029fa 100644 --- a/multiarc/src/formats/7z/7z.cpp +++ b/multiarc/src/formats/7z/7z.cpp @@ -113,7 +113,7 @@ public: return _valid; } - int Next(struct PluginPanelItem *Item, struct ArcItemInfo *Info) + int Next(struct ArcItemInfo *Info) { if (!_valid) return GETARC_READERROR; @@ -159,15 +159,15 @@ public: ++_index; attribs&=~ (FILE_ATTRIBUTE_BROKEN | FILE_ATTRIBUTE_EXECUTABLE); - strncpy(Item->FindData.cFileName, name.c_str(), ARRAYSIZE(Item->FindData.cFileName)-1); - Item->FindData.dwFileAttributes = attribs; - Item->FindData.dwUnixMode = is_dir ? 0755 : 0644; - Item->FindData.nFileSize = file_size; - Item->FindData.nPhysicalSize = packed_size; - Item->CRC32 = crc32; + Info->PathName = name; + Info->dwFileAttributes = attribs; + Info->dwUnixMode = is_dir ? 0755 : 0644; + Info->nFileSize = file_size; + Info->nPhysicalSize = packed_size; + Info->CRC32 = crc32; - Item->FindData.ftLastWriteTime = ftm; - Item->FindData.ftCreationTime = ftc; + Info->ftLastWriteTime = ftm; + Info->ftCreationTime = ftc; Info->Solid = 0; @@ -211,12 +211,12 @@ BOOL WINAPI _export SEVENZ_OpenArchive(const char *Name,int *Type,bool Silent) -int WINAPI _export SEVENZ_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info) +int WINAPI _export SEVENZ_GetArcItem(struct ArcItemInfo *Info) { if (!s_selected_traverser) return GETARC_READERROR; - return s_selected_traverser->Next(Item, Info); + return s_selected_traverser->Next(Info); } diff --git a/multiarc/src/formats/ace/ace.cpp b/multiarc/src/formats/ace/ace.cpp index f3f2eb51..efaefee2 100644 --- a/multiarc/src/formats/ace/ace.cpp +++ b/multiarc/src/formats/ace/ace.cpp @@ -179,7 +179,7 @@ BOOL WINAPI _export ACE_OpenArchive(const char *Name,int *Type,bool Silent) -int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export ACE_GetArcItem(struct ArcItemInfo *Info) { struct ACEHEADERBLOCK { @@ -254,19 +254,15 @@ int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf FileHeader=(struct ACEHEADERFILE*)TempBuf; if(FileHeader->HeaderFlags&1) { - Item->FindData.dwFileAttributes=FileHeader->FileAttr; - if(FileHeader->FileNameSize) - { - if(FileHeader->FileNameSize >= (WORD)sizeof(Item->FindData.cFileName)) - return(GETARC_BROKEN); - memcpy(Item->FindData.cFileName,FileHeader->FileName,FileHeader->FileNameSize); - } - Item->FindData.cFileName[FileHeader->FileNameSize]=0; - Item->FindData.nFileSize=FileHeader->UnpSize; - Item->FindData.nPhysicalSize=FileHeader->PackSize; + Info->dwFileAttributes=FileHeader->FileAttr; + if(FileHeader->FileNameSize > Block.HeaderSize - (sizeof(ACEHEADERFILE) - 1)) + return(GETARC_BROKEN); + Info->PathName.assign(FileHeader->FileName,FileHeader->FileNameSize); + Info->nFileSize=FileHeader->UnpSize; + Info->nPhysicalSize=FileHeader->PackSize; FILETIME lft; WINPORT(DosDateTimeToFileTime)(FileHeader->FDate,FileHeader->FTime,&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime); Info->Solid=FileHeader->HeaderFlags&(1<<15)?1:0; Info->Encrypted=FileHeader->HeaderFlags&(1<<14)?1:0; @@ -275,8 +271,8 @@ int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf //????? Info->DictSize=1<<FileHeader->DictSize; //????? - strcpy(Info->HostOS,OSID[HostOS].Name); - Item->CRC32=FileHeader->CRC32; + Info->HostOS = OSID[HostOS].Name; + Info->CRC32=FileHeader->CRC32; NextPosition+=FileHeader->PackSize; break; diff --git a/multiarc/src/formats/all.h b/multiarc/src/formats/all.h index b7c646f2..f594355f 100644 --- a/multiarc/src/formats/all.h +++ b/multiarc/src/formats/all.h @@ -1,7 +1,7 @@ #pragma once BOOL WINAPI _export ACE_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export ACE_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export ACE_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export ACE_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export ACE_CloseArchive(struct ArcInfo *Info); DWORD WINAPI _export ACE_GetSFXPos(void); BOOL WINAPI _export ACE_GetFormatName(int Type,char *FormatName,char *DefaultExt); @@ -9,13 +9,13 @@ BOOL WINAPI _export ACE_GetDefaultCommands(int Type,int Command,char *Dest); BOOL WINAPI _export ARC_IsArchive(const char *Name,const unsigned char *Data,int DataSize); DWORD WINAPI _export ARC_GetSFXPos(void); BOOL WINAPI _export ARC_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export ARC_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export ARC_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export ARC_CloseArchive(struct ArcInfo *Info); BOOL WINAPI _export ARC_GetFormatName(int Type,char *FormatName,char *DefaultExt); BOOL WINAPI _export ARC_GetDefaultCommands(int Type,int Command,char *Dest); BOOL WINAPI _export ARJ_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export ARJ_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export ARJ_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export ARJ_CloseArchive(struct ArcInfo *Info); DWORD WINAPI _export ARJ_GetSFXPos(void); BOOL WINAPI _export ARJ_GetFormatName(int Type,char *FormatName,char *DefaultExt); @@ -23,7 +23,7 @@ BOOL WINAPI _export ARJ_GetDefaultCommands(int Type,int Command,char *Dest); void WINAPI _export RAR_SetFarInfo(const struct PluginStartupInfo *Info); BOOL WINAPI _export RAR_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export RAR_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export RAR_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export RAR_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export RAR_CloseArchive(struct ArcInfo *Info); DWORD WINAPI _export RAR_GetSFXPos(void); BOOL WINAPI _export RAR_GetFormatName(int Type,char *FormatName,char *DefaultExt); @@ -31,13 +31,13 @@ BOOL WINAPI _export RAR_GetDefaultCommands(int Type,int Command,char *Dest); BOOL WINAPI _export LIBARCH_IsArchive(const char *Name, const unsigned char *Data, int DataSize); BOOL WINAPI _export LIBARCH_OpenArchive(const char *Name, int *Type, bool Silent); DWORD WINAPI _export LIBARCH_GetSFXPos(void); -int WINAPI _export LIBARCH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export LIBARCH_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export LIBARCH_CloseArchive(struct ArcInfo *Info); BOOL WINAPI _export LIBARCH_GetFormatName(int Type, char *FormatName, char *DefaultExt); BOOL WINAPI _export LIBARCH_GetDefaultCommands(int Type, int Command, char *Dest); BOOL WINAPI _export ZIP_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export ZIP_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export ZIP_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export ZIP_CloseArchive(struct ArcInfo *Info); DWORD WINAPI _export ZIP_GetSFXPos(void); BOOL WINAPI _export ZIP_GetFormatName(int Type,char *FormatName,char *DefaultExt); @@ -45,7 +45,7 @@ BOOL WINAPI _export ZIP_GetDefaultCommands(int Type,int Command,char *Dest); void WINAPI _export LZH_SetFarInfo(const struct PluginStartupInfo *Info); BOOL WINAPI _export LZH_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export LZH_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export LZH_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export LZH_CloseArchive(struct ArcInfo *Info); DWORD WINAPI _export LZH_GetSFXPos(void); BOOL WINAPI _export LZH_GetFormatName(int Type,char *FormatName,char *DefaultExt); @@ -54,7 +54,7 @@ void WINAPI _export TARGZ_SetFarInfo(const struct PluginStartupInfo *Info); BOOL WINAPI _export TARGZ_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export TARGZ_OpenArchive(const char *Name,int *Type,bool Silent); DWORD WINAPI _export TARGZ_GetSFXPos(void); -int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export TARGZ_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export TARGZ_CloseArchive(struct ArcInfo *Info); BOOL WINAPI _export TARGZ_GetFormatName(int Type,char *FormatName,char *DefaultExt); BOOL WINAPI _export TARGZ_GetDefaultCommands(int Type,int Command,char *Dest); @@ -63,26 +63,26 @@ DWORD WINAPI _export CUSTOM_LoadFormatModule(const char *ModuleName); BOOL WINAPI _export CUSTOM_IsArchive(const char *FName, const unsigned char *Data, int DataSize); DWORD WINAPI _export CUSTOM_GetSFXPos(void); BOOL WINAPI _export CUSTOM_OpenArchive(const char *Name, int *Type, bool Silent); -int WINAPI _export CUSTOM_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info); +int WINAPI _export CUSTOM_GetArcItem( struct ArcItemInfo *Info); BOOL WINAPI _export CUSTOM_CloseArchive(struct ArcInfo * Info); BOOL WINAPI _export CUSTOM_GetFormatName(int Type, char *FormatName, char *DefaultExt); BOOL WINAPI _export CUSTOM_GetDefaultCommands(int Type, int Command, char *Dest); BOOL WINAPI _export SEVENZ_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export SEVENZ_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export SEVENZ_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info); +int WINAPI _export SEVENZ_GetArcItem( struct ArcItemInfo *Info); BOOL WINAPI _export SEVENZ_CloseArchive(struct ArcInfo *Info); BOOL WINAPI _export SEVENZ_GetFormatName(int Type,char *FormatName,char *DefaultExt); BOOL WINAPI _export SEVENZ_GetDefaultCommands(int Type,int Command,char *Dest); void WINAPI _export HA_SetFarInfo(const struct PluginStartupInfo *Info); BOOL WINAPI _export HA_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export HA_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export HA_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export HA_CloseArchive(struct ArcInfo *Info); BOOL WINAPI _export HA_GetFormatName(int Type,char *FormatName,char *DefaultExt); BOOL WINAPI _export HA_GetDefaultCommands(int Type,int Command,char *Dest); BOOL WINAPI _export CAB_IsArchive(const char *Name,const unsigned char *Data,int DataSize); BOOL WINAPI _export CAB_OpenArchive(const char *Name,int *Type,bool Silent); -int WINAPI _export CAB_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int WINAPI _export CAB_GetArcItem(struct ArcItemInfo *Info); BOOL WINAPI _export CAB_CloseArchive(struct ArcInfo *Info); DWORD WINAPI _export CAB_GetSFXPos(void); BOOL WINAPI _export CAB_GetFormatName(int Type,char *FormatName,char *DefaultExt); diff --git a/multiarc/src/formats/arc/arc.cpp b/multiarc/src/formats/arc/arc.cpp index b081ef29..d1d46dab 100644 --- a/multiarc/src/formats/arc/arc.cpp +++ b/multiarc/src/formats/arc/arc.cpp @@ -251,7 +251,7 @@ BOOL WINAPI _export ARC_OpenArchive(const char *Name,int *Type,bool Silent) } -int WINAPI _export ARC_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export ARC_GetArcItem(struct ArcItemInfo *Info) { ARCHeader Header; DWORD ReadSize; @@ -294,23 +294,24 @@ int WINAPI _export ARC_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf if(OffsetComment) { + char Description[32]; WINPORT(SetFilePointer)(ArcHandle,OffsetComment,NULL,FILE_BEGIN); - WINPORT(ReadFile)(ArcHandle,Info->Description,32,&ReadSize,NULL); + if (WINPORT(ReadFile)(ArcHandle,Description,32,&ReadSize,NULL)) + Info->Description.assign(Description, ReadSize); OffsetComment+=32; Info->Comment=1; } - strncpy(Item->FindData.cFileName,Header.Name,sizeof(Item->FindData.cFileName)-1); + StrAssignArray(Info->PathName, Header.Name); + Info->nFileSize=Header.OrigSize; + Info->dwFileAttributes=FILE_ATTRIBUTE_ARCHIVE; //?? + Info->nPhysicalSize=Header.CompSize; - Item->FindData.nFileSize=Header.OrigSize; - Item->FindData.dwFileAttributes=FILE_ATTRIBUTE_ARCHIVE; //?? - Item->FindData.nPhysicalSize=Header.CompSize; - - Item->CRC32=(DWORD)Header.CRC16; + Info->CRC32=(DWORD)Header.CRC16; FILETIME lft; WINPORT(DosDateTimeToFileTime)(Header.FileDate,Header.FileTime,&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime); int Ver=6*256; if(Header.Type == 1) diff --git a/multiarc/src/formats/arj/arj.cpp b/multiarc/src/formats/arj/arj.cpp index db124d49..c7fb8574 100644 --- a/multiarc/src/formats/arj/arj.cpp +++ b/multiarc/src/formats/arj/arj.cpp @@ -227,7 +227,7 @@ BOOL WINAPI _export ARJ_OpenArchive(const char *Name,int *Type,bool Silent) } -int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export ARJ_GetArcItem(struct ArcItemInfo *Info) { struct ARJHd2 { @@ -312,7 +312,7 @@ int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf Name[sizeof(Name)-1]=0; if (Name[strlen(Name)+1]!=0) Info->Comment=TRUE; - strncpy(Item->FindData.cFileName,Name,ARRAYSIZE(Item->FindData.cFileName)-1); + Info->PathName = Name; DWORD PrevPosition=NextPosition; NextPosition+=8+ArjHeader.HeadSize; @@ -331,32 +331,32 @@ int WINAPI _export ARJ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf Info->Encrypted=TRUE; Info->DictSize=32; - Item->CRC32=ArjHeader.CRC; + Info->CRC32=ArjHeader.CRC; if (ArjHeader.HostOS == 2 || ArjHeader.HostOS == 4) - Item->FindData.dwUnixMode=ArjHeader.AccessMode & 0777; + Info->dwUnixMode=ArjHeader.AccessMode & 0777; else - Item->FindData.dwFileAttributes=ArjHeader.AccessMode & 0x3f; - Item->FindData.nPhysicalSize=ArjHeader.PackSize; - Item->FindData.nFileSize=ArjHeader.UnpSize; + Info->dwFileAttributes=ArjHeader.AccessMode & 0x3f; + Info->nPhysicalSize=ArjHeader.PackSize; + Info->nFileSize=ArjHeader.UnpSize; FILETIME lft; WINPORT(DosDateTimeToFileTime)(HIWORD(ArjHeader.ftime),LOWORD(ArjHeader.ftime),&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime); if(ArjHeader.ARJVer >= 0x09 && // ??? 2.62 ??? (sizeof(ArjHeader)-sizeof(DWORD)*5) < ArjHeader.FirstHeadSize) // 5 = (Mark+HeadSize)+Extra1+atime+ctime+FSizeVol { WINPORT(DosDateTimeToFileTime)(HIWORD(ArjHeader.atime),LOWORD(ArjHeader.atime),&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastAccessTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastAccessTime); WINPORT(DosDateTimeToFileTime)(HIWORD(ArjHeader.ctime),LOWORD(ArjHeader.ctime),&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftCreationTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftCreationTime); } Info->Chapter=ArjHeader.LastChapter; //???? FirstChapter ???? Info->UnpVer=(ArjHeader.ARJExtrVer/10)*256+(ArjHeader.ARJExtrVer%10); if (ArjHeader.HostOS<ARRAYSIZE(ArjOS)) - strcpy(Info->HostOS,ArjOS[ArjHeader.HostOS]); + Info->HostOS = ArjOS[ArjHeader.HostOS]; return(GETARC_SUCCESS); } diff --git a/multiarc/src/formats/cab/cab.cpp b/multiarc/src/formats/cab/cab.cpp index 7ebb52f9..4528cf33 100644 --- a/multiarc/src/formats/cab/cab.cpp +++ b/multiarc/src/formats/cab/cab.cpp @@ -176,7 +176,7 @@ BOOL WINAPI _export CAB_OpenArchive(const char *Name,int *Type,bool Silent) } -int WINAPI _export CAB_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export CAB_GetArcItem(struct ArcItemInfo *Info) { struct CFFILE FileHeader; @@ -202,18 +202,19 @@ int WINAPI _export CAB_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf if (EndPos[ 0 ] == '\\' && EndPos[ 1 ] != '\\') EndPos++; - strncpy(Item->FindData.cFileName, EndPos, ARRAYSIZE(Item->FindData.cFileName) - 1); - for (size_t i = 0; (i < ARRAYSIZE(Item->FindData.cFileName) && Item->FindData.cFileName[i]); ++i) { - if (Item->FindData.cFileName[i] == '\\') Item->FindData.cFileName[i] = '/'; + Info->PathName.assign(EndPos, strnlen(EndPos, &FileHeader.szName[ARRAYSIZE(FileHeader.szName)] - EndPos)); + + for (auto &c : Info->PathName) { + if (c == '\\') c = '/'; } #define _A_ENCRYPTED 8 - Item->FindData.dwFileAttributes = FileHeader.attribs & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_DIRECTORY); + Info->dwFileAttributes = FileHeader.attribs & (FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_DIRECTORY); Info->Encrypted = FileHeader.attribs & _A_ENCRYPTED; - Item->FindData.nPhysicalSize=0; - Item->FindData.nFileSize=FileHeader.cbFile; + Info->nPhysicalSize=0; + Info->nFileSize=FileHeader.cbFile; WINPORT(DosDateTimeToFileTime)(FileHeader.date,FileHeader.time,&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime); Info->UnpVer=UnpVer; return(GETARC_SUCCESS); } diff --git a/multiarc/src/formats/custom/custom.cpp b/multiarc/src/formats/custom/custom.cpp index 7e3aee37..2798d86f 100644 --- a/multiarc/src/formats/custom/custom.cpp +++ b/multiarc/src/formats/custom/custom.cpp @@ -69,10 +69,10 @@ static void MakeFiletime(SYSTEMTIME st, SYSTEMTIME syst, LPFILETIME pft); static int StringToInt(const char *str); static int64_t StringToInt64(const char *str); static void ParseListingItemRegExp(Match match, - struct PluginPanelItem *Item, struct ArcItemInfo *Info, + struct ArcItemInfo *Info, SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess); static void ParseListingItemPlain(const char *CurFormat, const char *CurStr, - struct PluginPanelItem *Item, struct ArcItemInfo *Info, + struct ArcItemInfo *Info, SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess); /////////////////////////////////////////////////////////////////////////////// @@ -563,7 +563,7 @@ BOOL WINAPI _export CUSTOM_OpenArchive(const char *Name, int *Type, bool Silent) } -int WINAPI _export CUSTOM_GetArcItem(struct PluginPanelItem *Item, struct ArcItemInfo *Info) +int WINAPI _export CUSTOM_GetArcItem( struct ArcItemInfo *Info) { char Str[512]; CustomStringList *CurFormatNode = Format; @@ -636,24 +636,24 @@ int WINAPI _export CUSTOM_GetArcItem(struct PluginPanelItem *Item, struct ArcIte if(re.compile(CurFormatNode->Str())) { if(Match match = re.match(Str)) - ParseListingItemRegExp(match, Item, Info, stModification, stCreation, stAccess); + ParseListingItemRegExp(match, Info, stModification, stCreation, stAccess); } else - ParseListingItemPlain(CurFormatNode->Str(), Str, Item, Info, stModification, stCreation, stAccess); + ParseListingItemPlain(CurFormatNode->Str(), Str, Info, stModification, stCreation, stAccess); CurFormatNode = CurFormatNode->Next(); if(!CurFormatNode || !CurFormatNode->Next()) { - MakeFiletime(stModification, syst, &Item->FindData.ftLastWriteTime); - MakeFiletime(stCreation, syst, &Item->FindData.ftCreationTime); - MakeFiletime(stAccess, syst, &Item->FindData.ftLastAccessTime); + MakeFiletime(stModification, syst, &Info->ftLastWriteTime); + MakeFiletime(stCreation, syst, &Info->ftCreationTime); + MakeFiletime(stAccess, syst, &Info->ftLastAccessTime); - for(int I = strlen(Item->FindData.cFileName) - 1; I >= 0; I--) + for(int I = int(Info->PathName.size()) - 1; I >= 0; I--) { - int Ch = Item->FindData.cFileName[I]; + char Ch = Info->PathName[I]; if(Ch == ' ' || Ch == '\t') - Item->FindData.cFileName[I] = 0; + Info->PathName.resize(I); else break; } @@ -898,28 +898,28 @@ static int StringToIntHex(const char *str) } static void ParseListingItemRegExp(Match match, - struct PluginPanelItem *Item, struct ArcItemInfo *Info, + struct ArcItemInfo *Info, SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess) { if(const char *p = match["name"]) - strncpy(Item->FindData.cFileName, p, sizeof(Item->FindData.cFileName)-1 ); + Info->PathName = p; if(const char *p = match["description"]) - strncpy(Info->Description, p, sizeof(Info->Description)-1 ); + Info->Description = p; - Item->FindData.nFileSize = StringToInt64(match["size"]); - Item->FindData.nPhysicalSize = StringToInt64(match["packedSize"]); + Info->nFileSize = StringToInt64(match["size"]); + Info->nPhysicalSize = StringToInt64(match["packedSize"]); for(const char *p = match["attr"]; p && *p; ++p) { switch(*p) { - case 'd': case 'D': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break; - case 'h': case 'H': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break; - case 'a': case 'A': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break; - case 'r': case 'R': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break; - case 's': case 'S': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break; - case 'c': case 'C': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break; - case 'x': case 'X': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break; + case 'd': case 'D': Info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break; + case 'h': case 'H': Info->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break; + case 'a': case 'A': Info->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break; + case 'r': case 'R': Info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break; + case 's': case 'S': Info->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break; + case 'c': case 'C': Info->dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break; + case 'x': case 'X': Info->dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break; } } @@ -975,13 +975,13 @@ static void ParseListingItemRegExp(Match match, stCreation.wMinute = StringToInt(match["cMin"]); stCreation.wSecond = StringToInt(match["cSec"]); - Item->CRC32 = StringToIntHex(match["CRC"]); + Info->CRC32 = StringToIntHex(match["CRC"]); } static void ParseListingItemPlain(const char *CurFormat, const char *CurStr, - struct PluginPanelItem *Item, struct ArcItemInfo *Info, + struct ArcItemInfo *Info, SYSTEMTIME &stModification, SYSTEMTIME &stCreation, SYSTEMTIME &stAccess) { enum @@ -1009,25 +1009,25 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr, CurStr++; break; case 'n': - strncat(Item->FindData.cFileName, CurStr, 1); + if (*CurStr) Info->PathName+= *CurStr; break; case 'c': - strncat(Info->Description, CurStr, 1); + if (*CurStr) Info->Description+= *CurStr; break; case '.': { - for(int I = strlen(Item->FindData.cFileName); I >= 0; I--) - if(isspace(Item->FindData.cFileName[I])) - Item->FindData.cFileName[I] = 0; - if(*Item->FindData.cFileName) - strncat(Item->FindData.cFileName, ".", sizeof(Item->FindData.cFileName) ); + for(int I = int(Info->PathName.size()) - 1; I >= 0; I--) + if(isspace(Info->PathName[I])) + Info->PathName.resize(I); + if(!Info->PathName.empty()) + Info->PathName+= '.'; } break; case 'z': if(isdigit(*CurStr)) { - Item->FindData.nFileSize*= 10; - Item->FindData.nFileSize+= (*CurStr - '0'); + Info->nFileSize*= 10; + Info->nFileSize+= (*CurStr - '0'); } else if(OP_INSIDE == OptionalPart) { @@ -1038,8 +1038,8 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr, case 'p': if(isdigit(*CurStr)) { - Item->FindData.nPhysicalSize*= 10; - Item->FindData.nPhysicalSize+= (*CurStr - '0'); + Info->nPhysicalSize*= 10; + Info->nPhysicalSize+= (*CurStr - '0'); } else if(OP_INSIDE == OptionalPart) { @@ -1050,13 +1050,13 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr, case 'a': switch (*CurStr) { - case 'd': case 'D': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break; - case 'h': case 'H': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break; - case 'a': case 'A': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break; - case 'r': case 'R': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break; - case 's': case 'S': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break; - case 'c': case 'C': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break; - case 'x': case 'X': Item->FindData.dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break; + case 'd': case 'D': Info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY; break; + case 'h': case 'H': Info->dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; break; + case 'a': case 'A': Info->dwFileAttributes |= FILE_ATTRIBUTE_ARCHIVE; break; + case 'r': case 'R': Info->dwFileAttributes |= FILE_ATTRIBUTE_READONLY; break; + case 's': case 'S': Info->dwFileAttributes |= FILE_ATTRIBUTE_SYSTEM; break; + case 'c': case 'C': Info->dwFileAttributes |= FILE_ATTRIBUTE_COMPRESSED; break; + case 'x': case 'X': Info->dwFileAttributes |= FILE_ATTRIBUTE_EXECUTABLE; break; } break; // MODIFICATION DATETIME @@ -1260,7 +1260,7 @@ static void ParseListingItemPlain(const char *CurFormat, const char *CurStr, if(isxdigit(toupper(*CurStr))) { char dig_sub = (*CurStr >= 'a' ? 'a' : (*CurStr >= 'A' ? 'A' : '0')); - Item->CRC32 = Item->CRC32 * 16 + (*CurStr - dig_sub); + Info->CRC32 = Info->CRC32 * 16 + (*CurStr - dig_sub); } else if(OP_INSIDE == OptionalPart) { diff --git a/multiarc/src/formats/ha/ha.cpp b/multiarc/src/formats/ha/ha.cpp index bcb17465..2da3adc8 100644 --- a/multiarc/src/formats/ha/ha.cpp +++ b/multiarc/src/formats/ha/ha.cpp @@ -77,7 +77,7 @@ BOOL WINAPI _export HA_OpenArchive(const char *Name,int *Type,bool Silent) } -int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export HA_GetArcItem(struct ArcItemInfo *Info) { struct HaHeader { @@ -97,8 +97,8 @@ int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo return(GETARC_READERROR); if (ReadSize==0) return(GETARC_EOF); - char Path[3*NM],Name[NM]; - if (!WINPORT(ReadFile)(ArcHandle,Path,sizeof(Path),&ReadSize,NULL) || ReadSize==0) + char Path[3*NM] = {0},Name[NM] = {0}; + if (!WINPORT(ReadFile)(ArcHandle,Path,NM,&ReadSize,NULL) || ReadSize==0) return(GETARC_READERROR); Path[NM-1]=0; int PathLength=strlen(Path)+1; @@ -117,12 +117,12 @@ int WINAPI _export HA_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo for (int I=0;Path[I]!=0;I++) if ((unsigned char)Path[I]==0xff) Path[I]='/'; - strncpy(Item->FindData.cFileName,Path,sizeof(Item->FindData.cFileName)-1); - Item->FindData.dwFileAttributes=(Header.Type & 0xf)==0xe ? FILE_ATTRIBUTE_DIRECTORY:0; - Item->CRC32=Header.CRC; - UnixTimeToFileTime(Header.FileTime,&Item->FindData.ftLastWriteTime); - Item->FindData.nFileSize=Header.UnpSize; - Item->FindData.nPhysicalSize=Header.PackSize; + Info->PathName = Path; + Info->dwFileAttributes=(Header.Type & 0xf)==0xe ? FILE_ATTRIBUTE_DIRECTORY:0; + Info->CRC32=Header.CRC; + UnixTimeToFileTime(Header.FileTime,&Info->ftLastWriteTime); + Info->nFileSize=Header.UnpSize; + Info->nPhysicalSize=Header.PackSize; return(GETARC_SUCCESS); } diff --git a/multiarc/src/formats/libarch/libarch.cpp b/multiarc/src/formats/libarch/libarch.cpp index 40881546..93e870cf 100644 --- a/multiarc/src/formats/libarch/libarch.cpp +++ b/multiarc/src/formats/libarch/libarch.cpp @@ -234,7 +234,7 @@ DWORD WINAPI _export LIBARCH_GetSFXPos(void) } -int WINAPI _export LIBARCH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export LIBARCH_GetArcItem(struct ArcItemInfo *Info) { try { if (!s_arc) @@ -254,37 +254,38 @@ int WINAPI _export LIBARCH_GetArcItem(struct PluginPanelItem *Item,struct ArcIte break; } } - strncpy(Item->FindData.cFileName, pathname, sizeof(Item->FindData.cFileName) - 1); + + Info->PathName = pathname; uint64_t sz = archive_entry_size(entry); if (sz == 0 && !archive_entry_size_is_set(entry) && s_UnpackedSizeWorkaround != nullptr) { sz = s_UnpackedSizeWorkaround(s_arc.get()); } - Item->FindData.nFileSize = sz; - Item->FindData.nPhysicalSize = sz; - Item->FindData.dwUnixMode = archive_entry_mode(entry); - Item->FindData.dwFileAttributes = - WINPORT(EvaluateAttributesA)(Item->FindData.dwUnixMode, Item->FindData.cFileName); + Info->nFileSize = sz; + Info->nPhysicalSize = sz; + Info->dwUnixMode = archive_entry_mode(entry); + Info->dwFileAttributes = + WINPORT(EvaluateAttributesA)(Info->dwUnixMode, Info->PathName.c_str()); if (archive_entry_ctime_is_set(entry)) { - ArcTM(Item->FindData.ftCreationTime, archive_entry_ctime(entry), archive_entry_ctime_nsec(entry)); + ArcTM(Info->ftCreationTime, archive_entry_ctime(entry), archive_entry_ctime_nsec(entry)); } else if (archive_entry_birthtime_is_set(entry)) { - ArcTM(Item->FindData.ftCreationTime, archive_entry_birthtime(entry), archive_entry_birthtime_nsec(entry)); + ArcTM(Info->ftCreationTime, archive_entry_birthtime(entry), archive_entry_birthtime_nsec(entry)); } else if (archive_entry_mtime_is_set(entry)) { - ArcTM(Item->FindData.ftCreationTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry)); + ArcTM(Info->ftCreationTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry)); } if (archive_entry_mtime_is_set(entry)) { - ArcTM(Item->FindData.ftLastWriteTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry)); + ArcTM(Info->ftLastWriteTime, archive_entry_mtime(entry), archive_entry_mtime_nsec(entry)); } else { - Item->FindData.ftLastWriteTime = Item->FindData.ftCreationTime; + Info->ftLastWriteTime = Info->ftCreationTime; } if (archive_entry_atime_is_set(entry)) { - ArcTM(Item->FindData.ftLastAccessTime, archive_entry_atime(entry), archive_entry_atime_nsec(entry)); + ArcTM(Info->ftLastAccessTime, archive_entry_atime(entry), archive_entry_atime_nsec(entry)); } else { - Item->FindData.ftLastAccessTime = Item->FindData.ftLastWriteTime; + Info->ftLastAccessTime = Info->ftLastWriteTime; } } catch(std::exception &e) { diff --git a/multiarc/src/formats/lzh/lzh.cpp b/multiarc/src/formats/lzh/lzh.cpp index 05295dec..bef1b63c 100644 --- a/multiarc/src/formats/lzh/lzh.cpp +++ b/multiarc/src/formats/lzh/lzh.cpp @@ -214,7 +214,7 @@ static void ReadOverflowable(HANDLE Handle, DWORD ChunkSize, void *Buf, DWORD Bu WINPORT(SetFilePointer)(Handle, ChunkSize - BufSize, NULL, FILE_CURRENT); } -int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export LZH_GetArcItem(struct ArcItemInfo *Info) { LZH_Header LzhHeader; @@ -362,8 +362,9 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf ? bytes Comments 2 bytes Next header size */ - ReadOverflowable(ArcHandle,NextHeaderSize-3,Info->Description,ARRAYSIZE(Info->Description)-1,&ReadSize); - Info->Description[ReadSize]=0; + char Description[256] = {0}; + ReadOverflowable(ArcHandle,NextHeaderSize-3,Description,ARRAYSIZE(Description),&ReadSize); + Info->Description.assign(Description, ReadSize); break; } @@ -382,7 +383,7 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf if (FileName[I]=='\xff' || FileName[I]=='\\') FileName[I]='/'; - Item->CRC32=(DWORD)CRC16; + Info->CRC32=(DWORD)CRC16; // correct NextPosition DWORD PrevPosition=NextPosition; @@ -395,27 +396,28 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf if (PrevPosition>=NextPosition || PathSize>NM) return(GETARC_BROKEN); - snprintf(Item->FindData.cFileName, ARRAYSIZE(Item->FindData.cFileName) - 1, "%s%s", PathName, FileName); + StrAssignArray(Info->PathName, PathName); + StrAppendArray(Info->PathName, FileName); - Item->FindData.dwFileAttributes=Attr; + Info->dwFileAttributes=Attr; //<????> if(LzhHeader.l0.Method == '0' || (LzhHeader.l0.Method == '4' && LzhHeader.l0.HeadID[2] == 'z')) - Item->FindData.nPhysicalSize=LzhHeader.l0.UnpSize; + Info->nPhysicalSize=LzhHeader.l0.UnpSize; else - Item->FindData.nPhysicalSize=(LzhHeader.l0.Method == 'd')?0:LzhHeader.l0.PackSize; + Info->nPhysicalSize=(LzhHeader.l0.Method == 'd')?0:LzhHeader.l0.PackSize; //</????> - Item->FindData.nFileSize=LzhHeader.l0.UnpSize; + Info->nFileSize=LzhHeader.l0.UnpSize; FILETIME lft; if(LzhHeader.l0.FLevel == 2) // level-2, Original file time stamp(UNIX type, seconds since 1970) { - UnixTimeToFileTime(MAKELONG(LzhHeader.l0.FTime,LzhHeader.l0.FDate),&Item->FindData.ftLastWriteTime); + UnixTimeToFileTime(MAKELONG(LzhHeader.l0.FTime,LzhHeader.l0.FDate),&Info->ftLastWriteTime); } else // Original file date/time (Generic time stamp) { WINPORT(DosDateTimeToFileTime)(LzhHeader.l0.FDate,LzhHeader.l0.FTime,&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime); } // OS ID - Host OS @@ -423,7 +425,7 @@ int WINAPI _export LZH_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf { if(OSID[I].Type == OsId) { - strcpy(Info->HostOS,OSID[I].Name); + Info->HostOS = OSID[I].Name; break; } } diff --git a/multiarc/src/formats/rar/rar.cpp b/multiarc/src/formats/rar/rar.cpp index 8b4ad5ee..748aeb47 100644 --- a/multiarc/src/formats/rar/rar.cpp +++ b/multiarc/src/formats/rar/rar.cpp @@ -68,7 +68,6 @@ static FARAPIMESSAGE FarMessage=NULL; static FARSTDSPRINTF FarSprintf=NULL; static bool KeepSilent = false; -#define UnicodeToOEM(src,dst,lendst) WINPORT(WideCharToMultiByte)(CP_UTF8,0,(src),-1,(dst),(lendst),NULL,FALSE) #define Min(x,y) (((x)<(y)) ? (x):(y)) @@ -183,7 +182,7 @@ BOOL WINAPI _export RAR_OpenArchive(const char *Name,int *Type,bool Silent) } -int WINAPI _export RAR_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export RAR_GetArcItem(struct ArcItemInfo *Info) { RHCode = RARReadHeaderEx(hArcData,&HeaderData); if(RHCode!=0) { @@ -191,44 +190,43 @@ int WINAPI _export RAR_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf return GETARC_READERROR;//GETARC_BROKEN; return GETARC_EOF; } - UnicodeToOEM(HeaderData.FileNameW,Item->FindData.cFileName,ARRAYSIZE(Item->FindData.cFileName)-1); - //strcpyn(Item->FindData.cFileName,HeaderData.FileName,sizeof(Item->FindData.cFileName)-1); - - Item->FindData.dwFileAttributes = WINPORT(EvaluateAttributes)(HeaderData.FileAttr, HeaderData.FileNameW); - Item->FindData.dwUnixMode = HeaderData.FileAttr; + + Wide2MB(HeaderData.FileNameW, Info->PathName); + Info->dwFileAttributes = WINPORT(EvaluateAttributes)(HeaderData.FileAttr, HeaderData.FileNameW); + Info->dwUnixMode = HeaderData.FileAttr; //HeaderData.FileAttr is unreliable - sometimes its a UNIX mode, sometimes Windows attributes //so sync with directory attribute in HeaderData.Flags if (HeaderData.Flags & RHDF_DIRECTORY) { - Item->FindData.dwFileAttributes|= FILE_ATTRIBUTE_DIRECTORY; - switch (Item->FindData.dwUnixMode & S_IFMT) { + Info->dwFileAttributes|= FILE_ATTRIBUTE_DIRECTORY; + switch (Info->dwUnixMode & S_IFMT) { case S_IFREG: case 0: - Item->FindData.dwUnixMode&= ~S_IFMT; - Item->FindData.dwUnixMode|= S_IFDIR; + Info->dwUnixMode&= ~S_IFMT; + Info->dwUnixMode|= S_IFDIR; } } else { - Item->FindData.dwFileAttributes&= ~FILE_ATTRIBUTE_DIRECTORY; - switch (Item->FindData.dwUnixMode & S_IFMT) { + Info->dwFileAttributes&= ~FILE_ATTRIBUTE_DIRECTORY; + switch (Info->dwUnixMode & S_IFMT) { case S_IFDIR: case 0: - Item->FindData.dwUnixMode&= ~S_IFMT; - Item->FindData.dwUnixMode|= S_IFREG; + Info->dwUnixMode&= ~S_IFMT; + Info->dwUnixMode|= S_IFREG; } } - Item->FindData.nFileSize = HeaderData.UnpSizeHigh; - Item->FindData.nFileSize<<= 32; - Item->FindData.nFileSize|= HeaderData.UnpSize; - Item->FindData.nPhysicalSize = HeaderData.PackSizeHigh; - Item->FindData.nPhysicalSize<<= 32; - Item->FindData.nPhysicalSize|= HeaderData.PackSize; - Item->CRC32=(DWORD)HeaderData.FileCRC; + Info->nFileSize = HeaderData.UnpSizeHigh; + Info->nFileSize<<= 32; + Info->nFileSize|= HeaderData.UnpSize; + Info->nPhysicalSize = HeaderData.PackSizeHigh; + Info->nPhysicalSize<<= 32; + Info->nPhysicalSize|= HeaderData.PackSize; + Info->CRC32=(DWORD)HeaderData.FileCRC; FILETIME lft; WINPORT(DosDateTimeToFileTime)(HIWORD(HeaderData.FileTime),LOWORD(HeaderData.FileTime),&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime); if (HeaderData.HostOS<ARRAYSIZE(RarOS)) - strcpy(Info->HostOS,RarOS[HeaderData.HostOS]); + Info->HostOS = RarOS[HeaderData.HostOS]; Info->Solid=Flags & 8; Info->Comment=HeaderData.Flags & 8; Info->Encrypted=HeaderData.Flags & 4; diff --git a/multiarc/src/formats/targz/targz.cpp b/multiarc/src/formats/targz/targz.cpp index f083c7cc..4ad710ce 100644 --- a/multiarc/src/formats/targz/targz.cpp +++ b/multiarc/src/formats/targz/targz.cpp @@ -133,8 +133,8 @@ typedef union { int IsTarHeader(const unsigned char *Data,int DataSize); int64_t GetOctal(const char *Str); -int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info); -int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info); +int GetArcItemGZIP(struct ArcItemInfo *Info); +int GetArcItemTAR(struct ArcItemInfo *Info); char *AdjustTARFileName(char *FileName); static int64_t Oct2Size (const char *where0, size_t digs0); @@ -219,7 +219,7 @@ DWORD WINAPI _export TARGZ_GetSFXPos(void) return 0; } -int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export TARGZ_GetArcItem(struct ArcItemInfo *Info) { if (ArcType!=TAR_FORMAT) { @@ -228,9 +228,9 @@ int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemI switch (ArcType) { case BZ_FORMAT: case XZ_FORMAT: - Item->FindData.nFileSize=FileSize.i64; - Item->FindData.nPhysicalSize=FileSize.i64; - strncpy(Item->FindData.cFileName,ZipName,ARRAYSIZE(Item->FindData.cFileName)-1); + Info->nFileSize=FileSize.i64; + Info->nPhysicalSize=FileSize.i64; + Info->PathName=ZipName; *ZipName=0; return(GETARC_SUCCESS); @@ -244,7 +244,7 @@ int WINAPI _export TARGZ_GetArcItem(struct PluginPanelItem *Item,struct ArcItemI return GetArcItemTAR(Item,Info); } -int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int GetArcItemGZIP(struct ArcItemInfo *Info) { DWORD ReadSize; struct GZHeader @@ -257,18 +257,18 @@ int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info) BYTE HostOS; } Header; - Item->FindData.cFileName[0] = 0; + Info->PathName.clear(); if (!WINPORT(ReadFile)(ArcHandle,&Header,sizeof(Header),&ReadSize,NULL)) return(GETARC_READERROR); - Item->FindData.nPhysicalSize=FileSize.i64; + Info->nPhysicalSize=FileSize.i64; if (ArcType==Z_FORMAT) { - strcpy(Item->FindData.cFileName,ZipName); + Info->PathName = ZipName; *ZipName=0; - Item->FindData.nFileSize=FileSize.i64; + Info->nFileSize=FileSize.i64; return(GETARC_SUCCESS); } @@ -283,41 +283,44 @@ int GetArcItemGZIP(struct PluginPanelItem *Item,struct ArcItemInfo *Info) WINPORT(SetFilePointer)(ArcHandle,ExtraLength,NULL,FILE_CURRENT); } + char cFileName[NM + 1] = {0}; if (Header.Flags & 8) - if (!WINPORT(ReadFile)(ArcHandle,Item->FindData.cFileName,sizeof(Item->FindData.cFileName),&ReadSize,NULL)) + if (!WINPORT(ReadFile)(ArcHandle,cFileName,sizeof(cFileName) - 1,&ReadSize,NULL)) return(GETARC_READERROR); - if (*Item->FindData.cFileName == 0) { - strncpy(Item->FindData.cFileName, ZipName, sizeof(Item->FindData.cFileName)-1 ); + if (cFileName[0] == 0) { + Info->PathName = ZipName; } else { // workaround for tar.gz archives that has original name set but without .tar extension // since tar archives detection relies on extension, it should be there (#173) + Info->PathName = cFileName; const char *ZipExt = strrchr(ZipName, '.'); if (ZipExt && strcasecmp(ZipExt, ".tar") == 0) { - const char *OrigExt = strrchr(Item->FindData.cFileName, '.'); + const char *OrigExt = strrchr(cFileName, '.'); if (!OrigExt || strcasecmp(OrigExt, ZipExt) != 0) { - strncat(Item->FindData.cFileName, ZipExt, sizeof(Item->FindData.cFileName)); + Info->PathName+= ZipExt; } } } *ZipName=0; - UnixTimeToFileTime(Header.FileTime,&Item->FindData.ftLastWriteTime); + UnixTimeToFileTime(Header.FileTime,&Info->ftLastWriteTime); Info->Comment=(Header.Flags & 16)!=0; Info->Encrypted=(Header.Flags & 32)!=0; WINPORT(SetFilePointer)(ArcHandle,-4,NULL,FILE_END); // reading 32-bit size into 64 bit fine unless host is a big-endian... - if (!WINPORT(ReadFile)(ArcHandle,&Item->FindData.nFileSize,sizeof(DWORD),&ReadSize,NULL)) + Info->nFileSize = 0; + if (!WINPORT(ReadFile)(ArcHandle,&Info->nFileSize,sizeof(DWORD),&ReadSize,NULL)) return(GETARC_READERROR); return(GETARC_SUCCESS); } -int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int GetArcItemTAR(struct ArcItemInfo *Info) { TARHeader TAR_hdr; DWORD ReadSize; @@ -369,8 +372,8 @@ int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info) np[sizeof(TAR_hdr.header.name)] = '\0'; EndPos = AdjustTARFileName(namebuf); } - strncpy(Item->FindData.cFileName, EndPos, sizeof(Item->FindData.cFileName)-1); - Item->FindData.nFileSize=0; + Info->PathName = EndPos; + Info->nFileSize=0; dwUnixMode = (DWORD)GetOctal(TAR_hdr.header.mode); switch (TAR_hdr.header.typeflag) { case REGTYPE: case AREGTYPE: @@ -402,25 +405,25 @@ int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info) if ((dwUnixMode & S_IFMT) == S_IFLNK) //TAR_hdr.header.typeflag == SYMTYPE || TAR_hdr.header.typeflag == LNKTYPE { - if((Item->UserData=(DWORD_PTR)MA_malloc(strlen(TAR_hdr.header.linkname)+2)) != 0) + if((Info->UserData=(DWORD_PTR)MA_malloc(strlen(TAR_hdr.header.linkname)+2)) != 0) { EndPos = AdjustTARFileName (TAR_hdr.header.linkname); if(TAR_hdr.header.typeflag == LNKTYPE) - *(char*)Item->UserData='/'; - strncpy((char*)Item->UserData+(TAR_hdr.header.typeflag == LNKTYPE?1:0),EndPos,strlen(TAR_hdr.header.linkname)+1); + *(char*)Info->UserData='/'; + strncpy((char*)Info->UserData+(TAR_hdr.header.typeflag == LNKTYPE?1:0),EndPos,strlen(TAR_hdr.header.linkname)+1); } } - Item->FindData.dwFileAttributes=WINPORT(EvaluateAttributesA)(dwUnixMode, Item->FindData.cFileName); - Item->FindData.dwUnixMode=dwUnixMode; + Info->dwFileAttributes=WINPORT(EvaluateAttributesA)(dwUnixMode, Info->PathName.c_str()); + Info->dwUnixMode=dwUnixMode; - UnixTimeToFileTime((DWORD)GetOctal(TAR_hdr.header.mtime),&Item->FindData.ftLastWriteTime); + UnixTimeToFileTime((DWORD)GetOctal(TAR_hdr.header.mtime),&Info->ftLastWriteTime); } DWORD64 TarItemSize = (TAR_hdr.header.typeflag == DIRTYPE) ? 0 : // #348 Oct2Size(TAR_hdr.header.size,sizeof(TAR_hdr.header.size)); - Item->FindData.nFileSize=TarItemSize; - Item->FindData.nPhysicalSize=TarItemSize; + Info->nFileSize=TarItemSize; + Info->nPhysicalSize=TarItemSize; strcpy(Info->HostOS,TarArchiveFormat==POSIX_FORMAT?"POSIX":(TarArchiveFormat==V7_FORMAT?"V7":"")); Info->UnpVer=256+11+(TarArchiveFormat >= POSIX_FORMAT?1:0); //!!! @@ -443,10 +446,10 @@ int GetArcItemTAR(struct PluginPanelItem *Item,struct ArcItemInfo *Info) // we can't have two LONGNAME records in a row without a file between them if (LongName != NULL) return GETARC_BROKEN; - LongName = (char *)malloc(Item->FindData.nPhysicalSize); + LongName = (char *)malloc(Info->nPhysicalSize); DWORD BytesRead; - WINPORT(ReadFile)(ArcHandle,LongName,Item->FindData.nPhysicalSize,&BytesRead,NULL); - if (BytesRead != Item->FindData.nPhysicalSize) + WINPORT(ReadFile)(ArcHandle,LongName,Info->nPhysicalSize,&BytesRead,NULL); + if (BytesRead != Info->nPhysicalSize) { free(LongName); return GETARC_BROKEN; diff --git a/multiarc/src/formats/zip/zip.cpp b/multiarc/src/formats/zip/zip.cpp index 860a3cdb..24ff1b00 100644 --- a/multiarc/src/formats/zip/zip.cpp +++ b/multiarc/src/formats/zip/zip.cpp @@ -26,20 +26,15 @@ using namespace oldfar; # define ZIP_LIBARCHIVE 0 #endif -static BOOL CPToUTF8( UINT cp, LPCSTR s, LPSTR d, int dlen ) +static void CPToUTF8( UINT cp, std::string &s ) { - if (!s || !d || dlen<=1 ) - return FALSE; - - std::vector<wchar_t> buf((1 + strlen( s )) * 2); - - int r = WINPORT(MultiByteToWideChar)( cp, 0, s, -1, &buf[0], buf.size() ); - if (r >= 0) { - r = WINPORT(WideCharToMultiByte)( CP_UTF8, 0, &buf[0], r, d, dlen - 1, NULL, NULL ); - d[ (r >= 0) ? r : 0 ] = 0; - } else - d[0] = 0; - return TRUE; + if (!s.empty()) { + std::vector<wchar_t> buf((1 + s.size()) * 2 + 1); + int r = WINPORT(MultiByteToWideChar)( cp, 0, s.c_str(), -1, &buf[0], buf.size() - 1 ); + if (r >= 0) { + Wide2MB(&buf[0], s); + } + } } #if defined(__BORLANDC__) @@ -219,7 +214,7 @@ BOOL WINAPI _export ZIP_OpenArchive(const char *Name,int *Type,bool Silent) } -int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInfo *Info) +int WINAPI _export ZIP_GetArcItem(struct ArcItemInfo *Info) { struct ZipHd1 { @@ -306,7 +301,7 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf { bTruncated=true; NextPosition.QuadPart=SFXSize.QuadPart; - return(ZIP_GetArcItem(Item,Info)); + return(ZIP_GetArcItem(Info)); } } else @@ -334,25 +329,22 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf if (ZipHeader.Mark==0x07064b50) //EOCD64Locator { NextPosition.QuadPart+= 20; - return ZIP_GetArcItem(Item,Info); + return ZIP_GetArcItem(Info); } - DWORD SizeToRead=(ZipHeader.NameLen<ARRAYSIZE(Item->FindData.cFileName)-1) ? ZipHeader.NameLen : ARRAYSIZE(Item->FindData.cFileName)-1; - if (!WINPORT(ReadFile)(ArcHandle,Item->FindData.cFileName,SizeToRead,&ReadSize,NULL) || + char cFileName[NM + 1] = {0}; + DWORD SizeToRead=std::min(DWORD(ZipHeader.NameLen), DWORD(ARRAYSIZE(cFileName)-1)); + if (!WINPORT(ReadFile)(ArcHandle,cFileName,SizeToRead,&ReadSize,NULL) || ReadSize!=SizeToRead) return(GETARC_READERROR); - Item->FindData.cFileName[ARRAYSIZE(Item->FindData.cFileName)-1]=0; - - char *EndPos = Item->FindData.cFileName; - while( *EndPos ) EndPos++; - - Item->FindData.nFileSize=ZipHeader.UnpSize; - Item->FindData.nPhysicalSize=ZipHeader.PackSize; - Item->CRC32=ZipHeader.CRC; + Info->PathName.assign(cFileName, strnlen(cFileName, ReadSize)); + Info->nFileSize=ZipHeader.UnpSize; + Info->nPhysicalSize=ZipHeader.PackSize; + Info->CRC32=ZipHeader.CRC; FILETIME lft; WINPORT(DosDateTimeToFileTime)(HIWORD(ZipHeader.ftime),LOWORD(ZipHeader.ftime),&lft); - WINPORT(LocalFileTimeToFileTime)(&lft,&Item->FindData.ftLastWriteTime); + WINPORT(LocalFileTimeToFileTime)(&lft,&Info->ftLastWriteTime); if (ZipHeader.Flags & 1) Info->Encrypted=TRUE; if (ZipHeader.CommLen > 0) @@ -362,7 +354,7 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf "Win32","SMS/QDOS","Acorn RISC OS","Win32 VFAT","MVS", "BeOS","Tandem"}; if (ZipHeader.PackOS<ARRAYSIZE(ZipOS)) - strncpy(Info->HostOS,ZipOS[ZipHeader.PackOS],ARRAYSIZE(Info->HostOS)-1); + Info->HostOS = ZipOS[ZipHeader.PackOS]; Info->Codepage = 0; @@ -371,11 +363,11 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf ; } else if (ZipHeader.PackOS==11 && ZipHeader.PackVer>=20) { // && ZipHeader.PackVer<25 - CPToUTF8(CP_ACP, Item->FindData.cFileName,Item->FindData.cFileName, ARRAYSIZE(Item->FindData.cFileName)); + CPToUTF8(CP_ACP, Info->PathName); Info->Codepage = WINPORT(GetACP)(); } else if (ZipHeader.PackOS==11 || ZipHeader.PackOS==0) { - CPToUTF8(CP_OEMCP, Item->FindData.cFileName, Item->FindData.cFileName, ARRAYSIZE(Item->FindData.cFileName)); + CPToUTF8(CP_OEMCP, Info->PathName); Info->Codepage = WINPORT(GetOEMCP)(); } @@ -383,17 +375,17 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf Info->DictSize=32; if ((ZipHeader.PackOS==3 || ZipHeader.PackOS==7) && (ZipHeader.Attr&0xffff0000)!=0) { - Item->FindData.dwUnixMode = ZipHeader.Attr>>16; - if ((Item->FindData.dwUnixMode & S_IFMT) == 0) { - Item->FindData.dwUnixMode|= S_IFREG; + Info->dwUnixMode = ZipHeader.Attr>>16; + if ((Info->dwUnixMode & S_IFMT) == 0) { + Info->dwUnixMode|= S_IFREG; } - Item->FindData.dwFileAttributes = WINPORT(EvaluateAttributesA)(Item->FindData.dwUnixMode, Item->FindData.cFileName); + Info->dwFileAttributes = WINPORT(EvaluateAttributesA)(Info->dwUnixMode, Info->PathName.c_str()); } else { - Item->FindData.dwUnixMode = 0; - Item->FindData.dwFileAttributes = ZipHeader.Attr & 0x3f; + Info->dwUnixMode = 0; + Info->dwFileAttributes = ZipHeader.Attr & 0x3f; } - memset(Info->Description, 0, sizeof(Info->Description)); + Info->Description.clear(); // Search for extra block ULARGE_INTEGER ExtraFieldEnd; @@ -451,9 +443,9 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf || ReadSize!=sizeof(Times) ) return(GETARC_READERROR); - Item->FindData.ftLastWriteTime = Times.Modification; - Item->FindData.ftLastAccessTime = Times.Access; - Item->FindData.ftCreationTime = Times.Creation; + Info->ftLastWriteTime = Times.Modification; + Info->ftLastAccessTime = Times.Access; + Info->ftCreationTime = Times.Creation; } } } @@ -474,11 +466,11 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf if (BlockHead.Length>=4) { - Item->FindData.nFileSize=ZIP64.OriginalSize.QuadPart; + Info->nFileSize=ZIP64.OriginalSize.QuadPart; } if (BlockHead.Length>=8) { - Item->FindData.nPhysicalSize=ZIP64.CompressedSize.QuadPart; + Info->nPhysicalSize=ZIP64.CompressedSize.QuadPart; } } else if ((0x7075==BlockHead.Type || 0x6375==BlockHead.Type) // Unicode Path Extra Field || Unicode Comment Extra Field @@ -491,18 +483,18 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf return(GETARC_READERROR); if (!WINPORT(ReadFile)(ArcHandle, &strcrc, sizeof(strcrc), &ReadSize, NULL) || ReadSize != sizeof(strcrc) ) return(GETARC_READERROR); - if (!WINPORT(ReadFile)(ArcHandle, &strbuf[0], strbuf.size()-1, &ReadSize, NULL) || ReadSize != strbuf.size()-1 ) + if (!WINPORT(ReadFile)(ArcHandle, strbuf.data(), strbuf.size()-1, &ReadSize, NULL) || ReadSize != strbuf.size()-1 ) return(GETARC_READERROR); if (version!=1) fprintf(stderr, "ZIP: Unicode Extra Field 0x%x unknown version %u\n", BlockHead.Type, version); if (0x7075==BlockHead.Type) { - strncpy(Item->FindData.cFileName, &strbuf[0], ARRAYSIZE(Item->FindData.cFileName) - 1); + Info->PathName = strbuf.data(); #if ZIP_LIBARCHIVE // if libarchive not used need to pass non-UTF8 codepage to zip/unzip workarounds Info->Codepage = 0; #endif } else { - strncpy(Info->Description, &strbuf[0], ARRAYSIZE(Info->Description) - 1); + Info->Description = strbuf.data(); } } else // Move to extra block end @@ -516,19 +508,20 @@ int WINAPI _export ZIP_GetArcItem(struct PluginPanelItem *Item,struct ArcItemInf if (ZipHeader.CommLen>0) { ReadSize = 0; - if (!Info->Description[0]) //we could already get UTF-8 description + if (!Info->Description.empty()) //we could already get UTF-8 description { - DWORD SizeToRead = (ZipHeader.CommLen>255) ? 255 : ZipHeader.CommLen; - - if (!WINPORT(ReadFile)(ArcHandle, Info->Description, SizeToRead, &ReadSize, NULL) + char Description[255]; + DWORD SizeToRead = std::min(DWORD(ZipHeader.CommLen), DWORD(ARRAYSIZE(Description))); + if (!WINPORT(ReadFile)(ArcHandle, Description, SizeToRead, &ReadSize, NULL) || ReadSize != SizeToRead ) return(GETARC_READERROR); + Info->Description.assign(Description, ReadSize); } // Skip comment tail WINPORT(SetFilePointer)(ArcHandle, ZipHeader.CommLen - ReadSize, NULL, FILE_CURRENT); } ULARGE_INTEGER SeekLen; - SeekLen.QuadPart = bTruncated ? Item->FindData.nPhysicalSize : 0; + SeekLen.QuadPart = bTruncated ? Info->nPhysicalSize : 0; WINPORT(SetFilePointer)(ArcHandle,SeekLen.u.LowPart,(PLONG)&SeekLen.u.HighPart,FILE_CURRENT); NextPosition.QuadPart=GetFilePosition(ArcHandle); return(GETARC_SUCCESS); diff --git a/utils/include/utils.h b/utils/include/utils.h index 51deb428..7196ce29 100644 --- a/utils/include/utils.h +++ b/utils/include/utils.h @@ -21,6 +21,13 @@ template <class C> static size_t tzlen(const C *ptz) return (etz - ptz); } +template <class C> static size_t tnzlen(const C *ptz, size_t n) +{ + size_t i; + for (i = 0; i < n && ptz[i]; ++i); + return i; +} + unsigned long htoul(const char *str, size_t maxlen = (size_t)-1); unsigned long atoul(const char *str, size_t maxlen = (size_t)-1); @@ -281,4 +288,30 @@ bool CaseIgnoreEngStrMatch(const char *str1, const char *str2, size_t len); const char *CaseIgnoreEngStrChr(const char c, const char *str, size_t len); +template <class POD_T> + void ZeroFill(POD_T &pod) +{ + memset(&pod, 0, sizeof(pod)); +} + +template <class STRING_T, typename ARRAY_T> + void StrAssignArray(STRING_T &s, const ARRAY_T &a) +{ + s.assign(a, tnzlen(a, ARRAYSIZE(a))); +} + +template <class STRING_T, typename ARRAY_T> + void StrAppendArray(STRING_T &s, const ARRAY_T &a) +{ + s.append(a, tnzlen(a, ARRAYSIZE(a))); +} + + +template <class STRING_T, typename ARRAY_T> + bool StrMatchArray(STRING_T &s, const ARRAY_T &a) +{ + const size_t l = tnzlen(a, ARRAYSIZE(a)); + return s.size() == l && s.compare(0, std::string::npos, a, l) == 0; +} + #define DBGLINE fprintf(stderr, "%d %d @%s\n", getpid(), __LINE__, __FILE__) |