From: <sv...@op...> - 2024-05-11 20:13:58
|
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) { |