Author: sagamusix
Date: Sat May 11 22:13:51 2024
New Revision: 20764
URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20764
Log:
Merged revision(s) 20693, 20742 from trunk/OpenMPT:
[Imp] XM: Reject files with impossible pattern header.
[Imp] XM: Speed up decoding early if pattern data cannot be read, ignore patterns > MAX_PATTERNS for decoding.
........
[Fix] ULT: Strings are space-padded, not null-terminated.
........
Modified:
branches/OpenMPT-1.29/ (props changed)
branches/OpenMPT-1.29/soundlib/Load_ult.cpp
branches/OpenMPT-1.29/soundlib/Load_xm.cpp
Modified: branches/OpenMPT-1.29/soundlib/Load_ult.cpp
==============================================================================
--- branches/OpenMPT-1.29/soundlib/Load_ult.cpp Sat May 11 22:13:28 2024 (r20763)
+++ branches/OpenMPT-1.29/soundlib/Load_ult.cpp Sat May 11 22:13:51 2024 (r20764)
@@ -18,7 +18,7 @@
{
char signature[14]; // "MAS_UTrack_V00"
uint8 version; // '1'...'4'
- char songName[32]; // Song Name, not guaranteed to be null-terminated
+ char songName[32]; // Song Name, space-padded
uint8 messageLength; // Number of Lines
};
@@ -50,7 +50,7 @@
{
mptSmp.Initialize();
- mptSmp.filename = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, filename);
+ mptSmp.filename = mpt::String::ReadBuf(mpt::String::spacePadded, filename);
if(sizeEnd <= sizeStart)
{
@@ -385,7 +385,7 @@
}
InitializeGlobals(MOD_TYPE_ULT);
- m_songName = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, fileHeader.songName);
+ m_songName = mpt::String::ReadBuf(mpt::String::spacePadded, fileHeader.songName);
const mpt::uchar *versions[] = {UL_("<1.4"), UL_("1.4"), UL_("1.5"), UL_("1.6")};
m_modFormat.formatName = U_("UltraTracker");
@@ -419,7 +419,7 @@
}
sampleHeader.ConvertToMPT(Samples[smp]);
- m_szNames[smp] = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, sampleHeader.name);
+ m_szNames[smp] = mpt::String::ReadBuf(mpt::String::spacePadded, sampleHeader.name);
}
ReadOrderFromFile<uint8>(Order(), file, 256, 0xFF, 0xFE);
Modified: branches/OpenMPT-1.29/soundlib/Load_xm.cpp
==============================================================================
--- branches/OpenMPT-1.29/soundlib/Load_xm.cpp Sat May 11 22:13:28 2024 (r20763)
+++ branches/OpenMPT-1.29/soundlib/Load_xm.cpp Sat May 11 22:13:51 2024 (r20764)
@@ -242,18 +242,16 @@
for(PATTERNINDEX pat = 0; pat < fileHeader.patterns; pat++)
{
FileReader::off_t curPos = file.GetPosition();
- uint32 headerSize = file.ReadUint32LE();
- file.Skip(1); // Pack method (= 0)
-
- ROWINDEX numRows = 64;
+ const uint32 headerSize = file.ReadUint32LE();
+ if(headerSize < 8 || !file.CanRead(headerSize - 4))
+ break;
+ file.Skip(1); // Pack method (= 0)
+ ROWINDEX numRows;
if(fileHeader.version == 0x0102)
- {
numRows = file.ReadUint8() + 1;
- } else
- {
+ else
numRows = file.ReadUint16LE();
- }
// A packed size of 0 indicates a completely empty pattern.
const uint16 packedSize = file.ReadUint16LE();
@@ -266,10 +264,8 @@
file.Seek(curPos + headerSize);
FileReader patternChunk = file.ReadChunk(packedSize);
- if(!sndFile.Patterns.Insert(pat, numRows) || packedSize == 0)
- {
+ if(pat >= MAX_PATTERNS || !sndFile.Patterns.Insert(pat, numRows) || packedSize == 0)
continue;
- }
enum PatternFlags
{
@@ -285,6 +281,9 @@
for(auto &m : sndFile.Patterns[pat])
{
+ if(!file.CanRead(1))
+ break;
+
uint8 info = patternChunk.ReadUint8();
uint8 vol = 0;
@@ -1219,7 +1218,7 @@
if(!p->IsEmpty())
emptyPattern = false;
- // Apparently, completely empty patterns are loaded as empty 64-row patterns in FT2, regardless of their original size.
+ // Completely empty patterns are loaded as empty 64-row patterns in FT2, regardless of their original size.
// We have to avoid this, so we add a "break to row 0" command in the last row.
if(j == 1 && emptyPattern && numRows != 64)
{
|