aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLadislav Zezula <ladislav.zezula@avast.com>2023-02-06 18:30:15 +0100
committerLadislav Zezula <ladislav.zezula@avast.com>2023-02-06 18:30:15 +0100
commit0d31856af86ac47801ade118ea93092eab62a101 (patch)
treed51fdfad9d4f394d17a4b4df9ca9c0137e11b9c5
parent9beaed54cd6ef17ba3e0209233a29bd74184de6f (diff)
Fixed bug in the LZMA compression
-rw-r--r--StormLib_vs08_dll.vcproj8
-rw-r--r--src/SCompression.cpp2
-rw-r--r--src/SFileAddFile.cpp10
-rw-r--r--src/StormLib.h1
-rw-r--r--test/StormTest.cpp27
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 @@
/>
<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/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