|
From: <sag...@us...> - 2015-03-07 16:02:28
|
Revision: 4831
http://sourceforge.net/p/modplug/code/4831
Author: saga-games
Date: 2015-03-07 16:02:15 +0000 (Sat, 07 Mar 2015)
Log Message:
-----------
[Mod] Use FileReader at least for verifying files in the last three remaining loaders (MDL, MED, MID). The actual file loading is still done with raw memory access.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_mdl.cpp
trunk/OpenMPT/soundlib/Load_med.cpp
trunk/OpenMPT/soundlib/Load_mid.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mdl.cpp 2015-03-06 22:16:16 UTC (rev 4830)
+++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2015-03-07 16:02:15 UTC (rev 4831)
@@ -288,11 +288,27 @@
-bool CSoundFile::ReadMDL(const uint8 *lpStream, const DWORD dwMemLength, ModLoadingFlags loadFlags)
-//-------------------------------------------------------------------------------------------------
+bool CSoundFile::ReadMDL(FileReader &file, ModLoadingFlags loadFlags)
+//-------------------------------------------------------------------
{
+ file.Rewind();
+ MDLFileHeader pmsh;
+ if(!file.ReadStruct(pmsh)
+ || !file.CanRead(1024)
+ || pmsh.id != LittleEndian(0x4C444D44)
+ || (pmsh.version & 0xF0) > 0x10)
+ {
+ return false;
+ } else if(loadFlags == onlyVerifyHeader)
+ {
+ return true;
+ }
+
+ file.Rewind();
+ const FileReader::off_t dwMemLength = file.GetLength();
+ const uint8 *lpStream = reinterpret_cast<const uint8 *>(file.GetRawData());
+
DWORD dwMemPos, dwPos, blocklen, dwTrackPos;
- const MDLFileHeader *pmsh = (const MDLFileHeader *)lpStream;
MDLInfoBlock *pmib;
UINT i,j, norders = 0, npatterns = 0, ntracks = 0;
UINT ninstruments = 0, nsamples = 0;
@@ -305,11 +321,8 @@
UINT nvolenv, npanenv, npitchenv;
std::vector<ROWINDEX> patternLength;
- if ((!lpStream) || (dwMemLength < 1024)) return false;
- if ((pmsh->id != 0x4C444D44) || ((pmsh->version & 0xF0) > 0x10)) return false;
- else if(loadFlags == onlyVerifyHeader) return true;
#ifdef MDL_LOG
- Log("MDL v%d.%d\n", pmsh->version>>4, pmsh->version&0x0f);
+ Log("MDL v%d.%d\n", pmsh.version>>4, pmsh.version&0x0f);
#endif
MemsetZero(patterntracks);
MemsetZero(smpinfo);
@@ -388,7 +401,7 @@
UINT ch;
if (dwPos+18 >= dwMemLength) break;
- if (pmsh->version > 0)
+ if (pmsh.version > 0)
{
const MDLPatternHeader *pmpd = (const MDLPatternHeader *)(lpStream + dwPos);
if (pmpd->channels > 32) break;
@@ -520,7 +533,7 @@
#endif
nsamples = lpStream[dwMemPos];
dwPos = dwMemPos + 1;
- for (i = 0; i < nsamples; i++, dwPos += (pmsh->version > 0) ? sizeof(MDLSampleHeader) : sizeof(MDLSampleHeaderv0))
+ for (i = 0; i < nsamples; i++, dwPos += (pmsh.version > 0) ? sizeof(MDLSampleHeader) : sizeof(MDLSampleHeaderv0))
{
const MDLSampleHeaderCommon *info = reinterpret_cast<const MDLSampleHeaderCommon *>(lpStream + dwPos);
if(!IsInRange(info->sampleIndex, 1, MAX_SAMPLES-1))
@@ -537,7 +550,7 @@
mpt::String::Read<mpt::String::maybeNullTerminated>(m_szNames[info->sampleIndex], info->name);
mpt::String::Read<mpt::String::maybeNullTerminated>(sample.filename, info->filename);
- if(pmsh->version > 0)
+ if(pmsh.version > 0)
{
const MDLSampleHeader *sampleHeader = reinterpret_cast<const MDLSampleHeader *>(lpStream + dwPos);
Modified: trunk/OpenMPT/soundlib/Load_med.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_med.cpp 2015-03-06 22:16:16 UTC (rev 4830)
+++ trunk/OpenMPT/soundlib/Load_med.cpp 2015-03-07 16:02:15 UTC (rev 4831)
@@ -66,7 +66,7 @@
typedef struct PACKED tagMEDMODULEHEADER
{
- DWORD id; // MMD1-MMD3
+ char id[4]; // MMD1-MMD3
DWORD modlen; // Size of file
DWORD song; // Position in file for this song
WORD psecnum;
@@ -502,47 +502,57 @@
}
-bool CSoundFile::ReadMed(const uint8 *lpStream, const DWORD dwMemLength, ModLoadingFlags loadFlags)
-//-------------------------------------------------------------------------------------------------
+bool CSoundFile::ReadMed(FileReader &file, ModLoadingFlags loadFlags)
+//------------------------------------------------------------------
{
- const MEDMODULEHEADER *pmmh;
+ file.Rewind();
+ MEDMODULEHEADER pmmh;
+ DWORD dwSong;
+ if(!file.CanRead(512)
+ || !file.ReadStruct(pmmh)
+ || memcmp(pmmh.id, "MMD", 3)
+ || pmmh.id[3] < '0' || pmmh.id[3] > '3'
+ || (dwSong = BigEndian(pmmh.song)) == 0
+ || !file.LengthIsAtLeast(dwSong)
+ || !file.LengthIsAtLeast(dwSong + sizeof(MMD0SONGHEADER)))
+ {
+ return false;
+ } else if(loadFlags == onlyVerifyHeader)
+ {
+ return true;
+ }
+
+ file.Rewind();
+ const FileReader::off_t dwMemLength = file.GetLength();
+ const uint8 *lpStream = reinterpret_cast<const uint8 *>(file.GetRawData());
const MMD0SONGHEADER *pmsh;
const MMD2SONGHEADER *pmsh2;
const MMD0EXP *pmex;
DWORD dwBlockArr, dwSmplArr, dwExpData, wNumBlocks;
const_unaligned_ptr_le<DWORD> pdwTable;
- int8 version;
+ int8 version = pmmh.id[3];
UINT deftempo;
int playtransp = 0;
- if ((!lpStream) || (dwMemLength < 0x200)) return false;
- pmmh = (MEDMODULEHEADER *)lpStream;
- if (((pmmh->id & 0x00FFFFFF) != 0x444D4D) || (!pmmh->song)) return false;
- // Check for 'MMDx'
- DWORD dwSong = BigEndian(pmmh->song);
- if ((dwSong >= dwMemLength) || (dwSong + sizeof(MMD0SONGHEADER) >= dwMemLength)) return false;
- version = (signed char)((pmmh->id >> 24) & 0xFF);
- if ((version < '0') || (version > '3')) return false;
- else if(loadFlags == onlyVerifyHeader) return true;
#ifdef MED_LOG
- Log("\nLoading MMD%c module (flags=0x%02X)...\n", version, BigEndian(pmmh->mmdflags));
- Log(" modlen = %d\n", BigEndian(pmmh->modlen));
- Log(" song = 0x%08X\n", BigEndian(pmmh->song));
- Log(" psecnum = %d\n", BigEndianW(pmmh->psecnum));
- Log(" pseq = %d\n", BigEndianW(pmmh->pseq));
- Log(" blockarr = 0x%08X\n", BigEndian(pmmh->blockarr));
- Log(" mmdflags = 0x%08X\n", BigEndian(pmmh->mmdflags));
- Log(" smplarr = 0x%08X\n", BigEndian(pmmh->smplarr));
- Log(" reserved = 0x%08X\n", BigEndian(pmmh->reserved));
- Log(" expdata = 0x%08X\n", BigEndian(pmmh->expdata));
- Log(" reserved2= 0x%08X\n", BigEndian(pmmh->reserved2));
- Log(" pstate = %d\n", BigEndianW(pmmh->pstate));
- Log(" pblock = %d\n", BigEndianW(pmmh->pblock));
- Log(" pline = %d\n", BigEndianW(pmmh->pline));
- Log(" pseqnum = %d\n", BigEndianW(pmmh->pseqnum));
- Log(" actplayline=%d\n", BigEndianW(pmmh->actplayline));
- Log(" counter = %d\n", pmmh->counter);
- Log(" extra_songs = %d\n", pmmh->extra_songs);
+ Log("\nLoading MMD%c module (flags=0x%02X)...\n", version, BigEndian(pmmh.mmdflags));
+ Log(" modlen = %d\n", BigEndian(pmmh.modlen));
+ Log(" song = 0x%08X\n", BigEndian(pmmh.song));
+ Log(" psecnum = %d\n", BigEndianW(pmmh.psecnum));
+ Log(" pseq = %d\n", BigEndianW(pmmh.pseq));
+ Log(" blockarr = 0x%08X\n", BigEndian(pmmh.blockarr));
+ Log(" mmdflags = 0x%08X\n", BigEndian(pmmh.mmdflags));
+ Log(" smplarr = 0x%08X\n", BigEndian(pmmh.smplarr));
+ Log(" reserved = 0x%08X\n", BigEndian(pmmh.reserved));
+ Log(" expdata = 0x%08X\n", BigEndian(pmmh.expdata));
+ Log(" reserved2= 0x%08X\n", BigEndian(pmmh.reserved2));
+ Log(" pstate = %d\n", BigEndianW(pmmh.pstate));
+ Log(" pblock = %d\n", BigEndianW(pmmh.pblock));
+ Log(" pline = %d\n", BigEndianW(pmmh.pline));
+ Log(" pseqnum = %d\n", BigEndianW(pmmh.pseqnum));
+ Log(" actplayline=%d\n", BigEndianW(pmmh.actplayline));
+ Log(" counter = %d\n", pmmh.counter);
+ Log(" extra_songs = %d\n", pmmh.extra_songs);
Log("\n");
#endif
@@ -554,9 +564,9 @@
m_nType = MOD_TYPE_MED;
m_nSamplePreAmp = 32;
- dwBlockArr = BigEndian(pmmh->blockarr);
- dwSmplArr = BigEndian(pmmh->smplarr);
- dwExpData = BigEndian(pmmh->expdata);
+ dwBlockArr = BigEndian(pmmh.blockarr);
+ dwSmplArr = BigEndian(pmmh.smplarr);
+ dwExpData = BigEndian(pmmh.expdata);
if ((dwExpData) && (dwExpData < dwMemLength - sizeof(MMD0EXP)))
pmex = (MMD0EXP *)(lpStream+dwExpData);
else
Modified: trunk/OpenMPT/soundlib/Load_mid.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mid.cpp 2015-03-06 22:16:16 UTC (rev 4830)
+++ trunk/OpenMPT/soundlib/Load_mid.cpp 2015-03-07 16:02:15 UTC (rev 4831)
@@ -39,7 +39,7 @@
typedef struct PACKED MIDIFILEHEADER
{
- DWORD id; // "MThd" = 0x6468544D
+ char id[4]; // "MThd" = 0x6468544D
DWORD len; // 6
WORD w1; // 1?
WORD wTrks; // 2?
@@ -468,15 +468,56 @@
#define MIDIGLOBAL_XGSYSTEMON 0x0200
-bool CSoundFile::ReadMID(const uint8 *lpStream, DWORD dwMemLength, ModLoadingFlags loadFlags)
-//-------------------------------------------------------------------------------------------
+bool CSoundFile::ReadMID(FileReader &file, ModLoadingFlags loadFlags)
+//-------------------------------------------------------------------
{
- const MIDIFILEHEADER *pmfh = (const MIDIFILEHEADER *)lpStream;
+ file.Rewind();
+
+ // Microsoft MIDI files
+ if(file.ReadMagic("RIFF"))
+ {
+ file.Skip(4);
+ if(!file.ReadMagic("RMID"))
+ {
+ return false;
+ } else if(loadFlags == onlyVerifyHeader)
+ {
+ return true;
+ }
+ do
+ {
+ uint32 id = file.ReadUint32LE();
+ uint32 length = file.ReadUint32LE();
+ if(memcmp(&id, "data", 4))
+ {
+ file.Skip(length);
+ } else
+ {
+ break;
+ }
+ } while(file.BytesLeft());
+ }
+
+ MIDIFILEHEADER pmfh;
+ if(!file.ReadStruct(pmfh)
+ || memcmp(pmfh.id, "MThd", 4)
+ || !file.Seek(8 + BigEndian(pmfh.len)))
+ {
+ return false;
+ } else if(loadFlags == onlyVerifyHeader)
+ {
+ return true;
+ }
+
+ const FileReader::off_t dwMemLength = file.BytesLeft();
+ const uint8 *lpStream = reinterpret_cast<const uint8 *>(file.GetRawData());
+
const MIDITRACKHEADER *pmth;
MODCHANNELSTATE chnstate[MAX_BASECHANNELS];
MIDICHANNELSTATE midichstate[16];
std::vector<MIDITRACK> miditracks;
- DWORD dwMemPos, dwGlobalFlags, tracks, tempo;
+ FileReader::off_t dwMemPos = 0;
+ DWORD dwGlobalFlags, tracks, tempo;
UINT row, pat, midimastervol;
short int division;
int midi_clock, nTempoUsec, nPPQN, nTickMultiplier;
@@ -493,36 +534,8 @@
Limit(importSpeed, 2, 6);
Limit(importPatternLen, ROWINDEX(1), MAX_PATTERN_ROWS);
- // Detect RMI files
- if ((dwMemLength > 12)
- && (*(DWORD *)(lpStream) == IFFID_RIFF)
- && (*(DWORD *)(lpStream+8) == 0x44494D52))
- {
- lpStream += 12;
- dwMemLength -= 12;
- while (dwMemLength > 8)
- {
- DWORD id = *(DWORD *)lpStream;
- DWORD len = *(DWORD *)(lpStream+4);
- lpStream += 8;
- dwMemLength -= 8;
- if ((id == IFFID_data) && (len < dwMemLength))
- {
- dwMemLength = len;
- pmfh = (const MIDIFILEHEADER *)lpStream;
- break;
- }
- if (len >= dwMemLength) return false;
- lpStream += len;
- dwMemLength -= len;
- }
- }
- // MIDI File Header
- if ((dwMemLength < sizeof(MIDIFILEHEADER)+8) || (pmfh->id != 0x6468544D)) return false;
- dwMemPos = 8 + BigEndian(pmfh->len);
- if (dwMemPos >= dwMemLength - 8) return false;
pmth = (MIDITRACKHEADER *)(lpStream+dwMemPos);
- tracks = BigEndianW(pmfh->wTrks);
+ tracks = BigEndianW(pmfh.wTrks);
if ((pmth->id != 0x6B72544D) || (!tracks)) return false;
else if(loadFlags == onlyVerifyHeader) return true;
miditracks.resize(tracks);
@@ -535,7 +548,7 @@
songName = "";
// MIDI->MOD Tempo Conversion
- division = BigEndianW(pmfh->wDivision);
+ division = BigEndianW(pmfh.wDivision);
if (division < 0)
{
int nFrames = -(division>>8);
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2015-03-06 22:16:16 UTC (rev 4830)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2015-03-07 16:02:15 UTC (rev 4831)
@@ -739,9 +739,9 @@
&& !ReadWav(file, loadFlags)
#endif // MODPLUG_TRACKER
&& !ReadSTM(file, loadFlags)
- && !ReadMed(lpStream, dwMemLength, loadFlags)
+ && !ReadMed(file, loadFlags)
&& !ReadMTM(file, loadFlags)
- && !ReadMDL(lpStream, dwMemLength, loadFlags)
+ && !ReadMDL(file, loadFlags)
&& !ReadDBM(file, loadFlags)
&& !Read669(file, loadFlags)
&& !ReadFAR(file, loadFlags)
@@ -759,7 +759,7 @@
&& !ReadPSM16(file, loadFlags)
&& !ReadMT2(file, loadFlags)
#ifdef MODPLUG_TRACKER
- && !ReadMID(lpStream, dwMemLength, loadFlags)
+ && !ReadMID(file, loadFlags)
#endif // MODPLUG_TRACKER
&& !ReadGDM(file, loadFlags)
&& !ReadIMF(file, loadFlags)
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2015-03-06 22:16:16 UTC (rev 4830)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2015-03-07 16:02:15 UTC (rev 4831)
@@ -666,7 +666,7 @@
bool ReadMod(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadM15(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadICE(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
- bool ReadMed(const uint8 *lpStream, const DWORD dwMemLength, ModLoadingFlags loadFlags = loadCompleteModule);
+ bool ReadMed(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadMTM(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadSTM(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadIT(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
@@ -678,7 +678,7 @@
bool ReadFAR(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadAMS(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadAMS2(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
- bool ReadMDL(const uint8 *lpStream, const DWORD dwMemLength, ModLoadingFlags loadFlags = loadCompleteModule);
+ bool ReadMDL(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadOKT(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadDMF(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadPTM(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
@@ -696,7 +696,7 @@
bool ReadJ2B(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadDIGI(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
bool ReadPLM(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
- bool ReadMID(const uint8 *lpStream, DWORD dwMemLength, ModLoadingFlags loadFlags = loadCompleteModule);
+ bool ReadMID(FileReader &file, ModLoadingFlags loadFlags = loadCompleteModule);
static std::vector<const char *> GetSupportedExtensions(bool otherFormats);
static mpt::Charset GetCharsetFromModType(MODTYPE modtype);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|