diff options
author | Ladislav Zezula <zezula@volny.cz> | 2023-02-07 09:10:58 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-07 09:10:58 +0100 |
commit | 33e6a2bdfec872c31bfd7ce2899012c129894f7e (patch) | |
tree | 6cebd387986b6870d03161d1bc25d9c1c382651d | |
parent | 9beaed54cd6ef17ba3e0209233a29bd74184de6f (diff) | |
parent | 01e940f998e64ceb60d39a30d0e40c33be430744 (diff) |
Merge pull request #285 from ladislav-zezula/LZ_LzmaFix
Fixed bug in the LZMA compression
-rw-r--r-- | StormLib_vs08_dll.vcproj | 8 | ||||
-rw-r--r-- | src/SCompression.cpp | 2 | ||||
-rw-r--r-- | src/SFileAddFile.cpp | 10 | ||||
-rw-r--r-- | src/SFileCreateArchive.cpp | 9 | ||||
-rw-r--r-- | test/StormTest.cpp | 31 |
5 files changed, 49 insertions, 11 deletions
diff --git a/StormLib_vs08_dll.vcproj b/StormLib_vs08_dll.vcproj index 4a04074..66f0705 100644 --- a/StormLib_vs08_dll.vcproj +++ b/StormLib_vs08_dll.vcproj @@ -92,7 +92,7 @@ /> <Tool Name="VCPostBuildEventTool" - CommandLine="PostBuild.bat $(ProjectName) $(PlatformName) $(ConfigurationName)" + CommandLine="" /> </Configuration> <Configuration @@ -169,7 +169,7 @@ /> <Tool Name="VCPostBuildEventTool" - CommandLine="PostBuild.bat $(ProjectName) $(PlatformName) $(ConfigurationName)" + CommandLine="" /> </Configuration> <Configuration @@ -245,7 +245,7 @@ /> <Tool Name="VCPostBuildEventTool" - CommandLine="PostBuild.bat $(ProjectName) $(PlatformName) $(ConfigurationName)" + CommandLine="" /> </Configuration> <Configuration @@ -322,7 +322,7 @@ /> <Tool Name="VCPostBuildEventTool" - CommandLine="PostBuild.bat $(ProjectName) $(PlatformName) $(ConfigurationName)" + CommandLine="" /> </Configuration> </Configurations> diff --git a/src/SCompression.cpp b/src/SCompression.cpp index 54c84b4..659c9a8 100644 --- a/src/SCompression.cpp +++ b/src/SCompression.cpp @@ -461,7 +461,7 @@ static void Compress_LZMA(void * pvOutBuffer, int * pcbOutBuffer, void * pvInBuf *pbOutBuffer++ = 0; // Copy the encoded properties to the output buffer - memcpy(pvOutBuffer, encodedProps, encodedPropsSize); + memcpy(pbOutBuffer, encodedProps, encodedPropsSize); pbOutBuffer += encodedPropsSize; // Copy the size of the data diff --git a/src/SFileAddFile.cpp b/src/SFileAddFile.cpp index b1288f1..5913424 100644 --- a/src/SFileAddFile.cpp +++ b/src/SFileAddFile.cpp @@ -896,6 +896,7 @@ bool WINAPI SFileAddFileEx( ULONGLONG FileSize = 0;
ULONGLONG FileTime = 0;
TFileStream * pStream = NULL;
+ TMPQArchive * ha;
HANDLE hMpqFile = NULL;
LPBYTE pbFileData = NULL;
DWORD dwBytesRemaining = 0;
@@ -907,7 +908,7 @@ bool WINAPI SFileAddFileEx( DWORD dwErrCode = ERROR_SUCCESS;
// Check parameters
- if(hMpq == NULL || szFileName == NULL || *szFileName == 0)
+ if(hMpq == NULL || szFileName == NULL || *szFileName == 0 || (ha = IsValidMpqHandle(hMpq)) == NULL)
{
SetLastError(ERROR_INVALID_PARAMETER);
return false;
@@ -933,6 +934,13 @@ bool WINAPI SFileAddFileEx( dwErrCode = ERROR_NOT_ENOUGH_MEMORY;
}
+ // LZMA compression can only be present in MPQ version 2 or higher
+ if(dwErrCode == ERROR_SUCCESS)
+ {
+ if(dwCompression == MPQ_COMPRESSION_LZMA && ha->pHeader->wFormatVersion == MPQ_FORMAT_VERSION_1)
+ dwErrCode = ERROR_INVALID_PARAMETER;
+ }
+
// Deal with various combination of compressions
if(dwErrCode == ERROR_SUCCESS)
{
diff --git a/src/SFileCreateArchive.cpp b/src/SFileCreateArchive.cpp index 4266070..c0ea367 100644 --- a/src/SFileCreateArchive.cpp +++ b/src/SFileCreateArchive.cpp @@ -27,6 +27,13 @@ static const DWORD MpqHeaderSizes[] = //----------------------------------------------------------------------------- // Local functions +static DWORD GetValidFileFlags(DWORD dwMpqVersion) +{ + if(dwMpqVersion > MPQ_FORMAT_VERSION_1) + return MPQ_FILE_VALID_FLAGS; + return MPQ_FILE_VALID_FLAGS_W3X; +} + static USHORT GetSectorSizeShift(DWORD dwSectorSize) { USHORT wSectorSizeShift = 0; @@ -211,7 +218,7 @@ bool WINAPI SFileCreateArchive2(const TCHAR * szMpqName, PSFILE_CREATE_MPQ pCrea ha->dwMaxFileCount = dwHashTableSize; ha->dwFileTableSize = 0; ha->dwReservedFiles = dwReservedFiles; - ha->dwValidFileFlags = (pCreateInfo->dwMpqVersion > 1) ? MPQ_FILE_VALID_FLAGS : MPQ_FILE_VALID_FLAGS_W3X; + ha->dwValidFileFlags = GetValidFileFlags(pCreateInfo->dwMpqVersion); ha->dwFileFlags1 = pCreateInfo->dwFileFlags1; ha->dwFileFlags2 = pCreateInfo->dwFileFlags2; ha->dwFileFlags3 = pCreateInfo->dwFileFlags3 ? MPQ_FILE_EXISTS : 0; diff --git a/test/StormTest.cpp b/test/StormTest.cpp index e8a52dc..2f45e96 100644 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -4183,7 +4183,32 @@ int _tmain(int argc, TCHAR * argv[]) // Initialize storage and mix the random number generator
printf("==== Test Suite for StormLib version %s ====\n", STORMLIB_VERSION_STRING);
dwErrCode = InitializeMpqDirectory(argv, argc);
+/*
+ // Check creation of the MPQ with LZMA compression
+ LPCTSTR szArchiveName = _T("E:\\new-mpq.mpq");
+ HANDLE hFile = NULL;
+ HANDLE hMpq = NULL;
+
+ DeleteFile(szArchiveName);
+ if(SFileCreateArchive(szArchiveName, MPQ_CREATE_ARCHIVE_V2 | MPQ_CREATE_LISTFILE | MPQ_CREATE_ATTRIBUTES, 0x1000, &hMpq))
+ {
+ SFileAddFileEx(hMpq, _T("e:\\DlgSearchFile.cpp"), "DlgSearchFile.cpp", MPQ_FILE_SINGLE_UNIT | MPQ_FILE_COMPRESS, MPQ_COMPRESSION_LZMA, MPQ_COMPRESSION_NEXT_SAME);
+ SFileCloseArchive(hMpq);
+
+ if(SFileOpenArchive(szArchiveName, 0, 0, &hMpq))
+ {
+ if(SFileOpenFileEx(hMpq, "DlgSearchFile.cpp", 0, &hFile))
+ {
+ DWORD dwBytesRead = 0;
+ BYTE Buffer[0x100];
+ SFileReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead, NULL);
+ SFileCloseFile(hFile);
+ }
+ SFileCloseArchive(hMpq);
+ }
+ }
+*/
#ifdef TEST_COMMAND_LINE
// Test-open MPQs from the command line. They must be plain name
// and must be placed in the Test-MPQs folder
@@ -4233,8 +4258,7 @@ int _tmain(int argc, TCHAR * argv[]) for(size_t i = 0; i < _countof(Test_OpenMpqs); i++)
{
dwErrCode = TestOpenArchive(Test_OpenMpqs[i]);
- //if(dwErrCode != ERROR_SUCCESS)
- // break;
+ dwErrCode = ERROR_SUCCESS;
}
}
#endif // TEST_OPEN_MPQ
@@ -4248,8 +4272,7 @@ int _tmain(int argc, TCHAR * argv[]) dwErrCode = TestReopenArchive(Test_ReopenMpqs[i].szName1,
Test_ReopenMpqs[i].szDataHash,
Test_ReopenMpqs[i].dwFlags);
- //if(dwErrCode != ERROR_SUCCESS)
- // break;
+ dwErrCode = ERROR_SUCCESS;
}
}
#endif
|