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 --- StormLib_vs08_dll.vcproj | 8 ++++---- src/SCompression.cpp | 2 +- src/SFileAddFile.cpp | 10 +++++++++- src/StormLib.h | 1 + test/StormTest.cpp | 27 +++++++++++++++++++++++++++ 5 files changed, 42 insertions(+), 6 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 @@ /> 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 | \ diff --git a/test/StormTest.cpp b/test/StormTest.cpp index e8a52dc..916eed0 100644 --- a/test/StormTest.cpp +++ b/test/StormTest.cpp @@ -4184,6 +4184,33 @@ int _tmain(int argc, TCHAR * argv[]) 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:\\DlgSetFileAssoc.cpp"), "DlgSetFileAssoc.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)) + { + 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 -- cgit v1.2.3