From 0d31856af86ac47801ade118ea93092eab62a101 Mon Sep 17 00:00:00 2001 From: Ladislav Zezula Date: Mon, 6 Feb 2023 18:30:15 +0100 Subject: Fixed bug in the LZMA compression --- src/SCompression.cpp | 2 +- src/SFileAddFile.cpp | 10 +++++++++- src/StormLib.h | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) (limited to 'src') 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/StormLib.h b/src/StormLib.h index e45f99d..dad9fc8 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -247,6 +247,7 @@ extern "C" { MPQ_FILE_COMPRESS | \ MPQ_FILE_ENCRYPTED | \ MPQ_FILE_FIX_KEY | \ + MPQ_FILE_SINGLE_UNIT | \ MPQ_FILE_DELETE_MARKER | \ MPQ_FILE_SECTOR_CRC | \ MPQ_FILE_SIGNATURE | \ -- cgit v1.2.3 From 01e940f998e64ceb60d39a30d0e40c33be430744 Mon Sep 17 00:00:00 2001 From: Ladislav Zezula Date: Tue, 7 Feb 2023 07:31:47 +0100 Subject: Fixed regression for W3 maps --- src/SFileCreateArchive.cpp | 9 ++++++++- src/StormLib.h | 1 - test/StormTest.cpp | 12 ++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) (limited to 'src') 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/src/StormLib.h b/src/StormLib.h index dad9fc8..e45f99d 100644 --- a/src/StormLib.h +++ b/src/StormLib.h @@ -247,7 +247,6 @@ extern "C" { MPQ_FILE_COMPRESS | \ MPQ_FILE_ENCRYPTED | \ MPQ_FILE_FIX_KEY | \ - MPQ_FILE_SINGLE_UNIT | \ MPQ_FILE_DELETE_MARKER | \ MPQ_FILE_SECTOR_CRC | \ MPQ_FILE_SIGNATURE | \ diff --git a/test/StormTest.cpp b/test/StormTest.cpp index 916eed0..2f45e96 100644 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -4183,7 +4183,6 @@ 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"); @@ -4193,12 +4192,12 @@ int _tmain(int argc, TCHAR * argv[]) DeleteFile(szArchiveName); if(SFileCreateArchive(szArchiveName, MPQ_CREATE_ARCHIVE_V2 | MPQ_CREATE_LISTFILE | MPQ_CREATE_ATTRIBUTES, 0x1000, &hMpq)) { - SFileAddFileEx(hMpq, _T("e:\\DlgSetFileAssoc.cpp"), "DlgSetFileAssoc.cpp", MPQ_FILE_SINGLE_UNIT | MPQ_FILE_COMPRESS, MPQ_COMPRESSION_LZMA, MPQ_COMPRESSION_NEXT_SAME); + 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, "DlgSetFileAssoc.cpp", 0, &hFile)) + if(SFileOpenFileEx(hMpq, "DlgSearchFile.cpp", 0, &hFile)) { DWORD dwBytesRead = 0; BYTE Buffer[0x100]; @@ -4210,7 +4209,6 @@ int _tmain(int argc, TCHAR * argv[]) } } */ - #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 @@ -4260,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 @@ -4275,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 -- cgit v1.2.3