From: <sag...@us...> - 2009-10-11 16:08:01
|
Revision: 394 http://modplug.svn.sourceforge.net/modplug/?rev=394&view=rev Author: saga-games Date: 2009-10-11 16:07:45 +0000 (Sun, 11 Oct 2009) Log Message: ----------- [Fix] J2B Loader: Fixed uncompress() call, added security check in RIFF AM loader [Imp] All Loaders: Using a new template, SpaceToNullStringFixed, which filters out all null chars in song/sample/instrument/etc. names. This avoids "empty" instrument names that occured in a couple of .IT files before. [Mod] Added IMF and J2B to glpszModExtensions Modified Paths: -------------- trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/misc_util.h trunk/OpenMPT/soundlib/LOAD_AMF.CPP trunk/OpenMPT/soundlib/LOAD_DBM.CPP trunk/OpenMPT/soundlib/LOAD_DMF.CPP trunk/OpenMPT/soundlib/LOAD_DSM.CPP trunk/OpenMPT/soundlib/Load_669.cpp trunk/OpenMPT/soundlib/Load_ams.cpp trunk/OpenMPT/soundlib/Load_far.cpp trunk/OpenMPT/soundlib/Load_gdm.cpp trunk/OpenMPT/soundlib/Load_imf.cpp trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_mdl.cpp trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Load_mtm.cpp trunk/OpenMPT/soundlib/Load_okt.cpp trunk/OpenMPT/soundlib/Load_psm.cpp trunk/OpenMPT/soundlib/Load_ptm.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_stm.cpp trunk/OpenMPT/soundlib/Load_ult.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/load_j2b.cpp Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -1836,6 +1836,8 @@ "Storlek for all the IT compatibility hints and testcases|" "as well as the IMF loader|" "http://schismtracker.org/|" + "kode54 for the PSM and J2B loaders|" + "http://kode54.foobar2000.org/|" "Pel K. Txnder for the scrolling credits control :)|" "http://tinyurl.com/4yze8|" "|The people at Modplug forums for crucial contribution|" Modified: trunk/OpenMPT/mptrack/misc_util.h =================================================================== --- trunk/OpenMPT/mptrack/misc_util.h 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/mptrack/misc_util.h 2009-10-11 16:07:45 UTC (rev 394) @@ -139,6 +139,7 @@ template <size_t size> void NullToSpaceString(char (&buffer)[size]) { + STATIC_ASSERT(size > 0); size_t pos = size; while (pos-- > 0) if (buffer[pos] == 0) @@ -149,6 +150,7 @@ template <size_t size> void SpaceToNullString(char (&buffer)[size]) { + STATIC_ASSERT(size > 0); // First, remove any Nulls NullToSpaceString(buffer); size_t pos = size; @@ -161,4 +163,22 @@ } buffer[size - 1] = 0; } + +// Convert a space-padded string to a 0-terminated string. +// Additional parameter to specifify the max length of the final string, +// not including null char (useful for e.g. mod loaders) +template <size_t size> +void SpaceToNullStringFixed(char (&buffer)[size], const size_t length) +//-------------------------------------------------------------------- +{ + STATIC_ASSERT(size > 0); + ASSERT(length < size); + // Remove Nulls in string + SpaceToNullString(buffer); + // Overwrite trailing chars + for(size_t pos = length; pos < size; pos++) + { + buffer[pos] = 0; + } +} #endif Modified: trunk/OpenMPT/soundlib/LOAD_AMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/LOAD_AMF.CPP 2009-10-11 16:07:45 UTC (rev 394) @@ -196,7 +196,8 @@ for (UINT iSmp=0; iSmp<numsamples; iSmp++) { MODSAMPLE *psmp = &Samples[iSmp+1]; - memcpy(m_szNames[iSmp+1], lpStream+dwMemPos, 22); + memcpy(m_szNames[iSmp + 1], lpStream+dwMemPos, 22); + SpaceToNullStringFixed(m_szNames[iSmp + 1], 22); psmp->nFineTune = MOD2XMFineTune(lpStream[dwMemPos+22]); psmp->nVolume = lpStream[dwMemPos+23]; psmp->nGlobalVol = 64; @@ -268,6 +269,7 @@ || (pfh->numchannels < 1) || (pfh->numchannels > 32)) return false; memcpy(m_szNames[0], pfh->title, 31); + SpaceToNullStringFixed(m_szNames[0], 31); dwMemPos = sizeof(AMFFILEHEADER); m_nType = MOD_TYPE_AMF; m_nChannels = pfh->numchannels; @@ -328,6 +330,8 @@ dwMemPos += sizeof(AMFSAMPLE); memcpy(m_szNames[iIns+1], psh->samplename, 31); memcpy(pSmp->filename, psh->filename, 13); + SpaceToNullStringFixed(m_szNames[iIns + 1], 31); + SpaceToNullStringFixed(pSmp->filename, 13); pSmp->nLength = LittleEndian(psh->length); pSmp->nC5Speed = LittleEndianW(psh->c2spd); pSmp->nGlobalVol = 64; Modified: trunk/OpenMPT/soundlib/LOAD_DBM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/LOAD_DBM.CPP 2009-10-11 16:07:45 UTC (rev 394) @@ -119,7 +119,7 @@ if (m_nChannels < 1) m_nChannels = 1; if (m_nChannels > 64) m_nChannels = 64; memcpy(m_szNames[0], (pfh->songname[0]) ? pfh->songname : pfh->songname2, 32); - m_szNames[0][31] = 0; + SpaceToNullStringFixed(m_szNames[0], 31); Order.resize(nOrders, Order.GetInvalidPatIndex()); for (UINT iOrd=0; iOrd < nOrders; iOrd++) { @@ -155,10 +155,11 @@ psmp = ((nsmp) && (nsmp < MAX_SAMPLES)) ? &Samples[nsmp] : NULL; memset(pIns, 0, sizeof(MODINSTRUMENT)); memcpy(pIns->name, pih->name, 30); + SpaceToNullStringFixed(pIns->name, 30); if (psmp) { memcpy(m_szNames[nsmp], pih->name, 30); - m_szNames[nsmp][30] = 0; + SpaceToNullStringFixed(m_szNames[nsmp], 30); } Instruments[iIns+1] = pIns; pIns->nFadeOut = 1024; // ??? Modified: trunk/OpenMPT/soundlib/LOAD_DMF.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/LOAD_DMF.CPP 2009-10-11 16:07:45 UTC (rev 394) @@ -100,7 +100,7 @@ if ((pfh->id != 0x464d4444) || (!pfh->version) || (pfh->version & 0xF0)) return false; dwMemPos = 66; memcpy(m_szNames[0], pfh->songname, 30); - m_szNames[0][30] = 0; + SpaceToNullStringFixed(m_szNames[0], 30); m_nType = MOD_TYPE_DMF; m_nChannels = 0; #ifdef DMFLOG @@ -395,7 +395,7 @@ { UINT rlen = (namelen < 32) ? namelen : 31; memcpy(m_szNames[iSmp], lpStream+dwPos+1, rlen); - m_szNames[iSmp][rlen] = 0; + SpaceToNullStringFixed(m_szNames[iSmp], rlen); } dwPos += namelen + 1; DMFSAMPLE *psh = (DMFSAMPLE *)(lpStream+dwPos); @@ -439,7 +439,7 @@ pksize = *((LPDWORD)(lpStream+dwPos)); #ifdef DMFLOG Log("sample %d: pos=0x%X pksize=%d ", iSmp, dwPos, pksize); - Log("len=%d flags=0x%X [%08X]\n", Ins[iSmp].nLength, smplflags[ismpd], *((LPDWORD)(lpStream+dwPos+4))); + Log("len=%d flags=0x%X [%08X]\n", Samples[iSmp].nLength, smplflags[ismpd], *((LPDWORD)(lpStream+dwPos+4))); #endif dwPos += 4; if (pksize > dwMemLength - dwPos) Modified: trunk/OpenMPT/soundlib/LOAD_DSM.CPP =================================================================== --- trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/LOAD_DSM.CPP 2009-10-11 16:07:45 UTC (rev 394) @@ -121,6 +121,7 @@ } } memcpy(m_szNames[0], psong->songname, 28); + SpaceToNullStringFixed(m_szNames[0], 28); nPat = 0; nSmp = 1; while (dwMemPos < dwMemLength - 8) @@ -214,8 +215,10 @@ DWORD dwPos = dwMemPos + sizeof(DSMSAMPLE); dwMemPos += 8 + pSmp->inst_len; memcpy(m_szNames[nSmp], pSmp->samplename, 28); + SpaceToNullStringFixed(m_szNames[nSmp], 28); MODSAMPLE *psmp = &Samples[nSmp]; memcpy(psmp->filename, pSmp->filename, 13); + SpaceToNullStringFixed(psmp->filename, 13); psmp->nGlobalVol = 64; psmp->nC5Speed = pSmp->c2spd; psmp->uFlags = (WORD)((pSmp->flags & 1) ? CHN_LOOP : 0); Modified: trunk/OpenMPT/soundlib/Load_669.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_669.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_669.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -68,9 +68,12 @@ m_nDefaultTempo = 125; m_nDefaultSpeed = 6; m_nChannels = 8; + memcpy(m_szNames[0], pfh->songmessage, 16); + SpaceToNullStringFixed(m_szNames[0], 16); + m_nSamples = pfh->samples; - for (UINT nins=1; nins<=m_nSamples; nins++, psmp++) + for (SAMPLEINDEX nSmp = 1; nSmp <= m_nSamples; nSmp++, psmp++) { DWORD len = LittleEndian(*((DWORD *)(&psmp->length))); DWORD loopstart = LittleEndian(*((DWORD *)(&psmp->loopstart))); @@ -79,14 +82,15 @@ if ((loopend > len) && (!loopstart)) loopend = 0; if (loopend > len) loopend = len; if (loopstart + 4 >= loopend) loopstart = loopend = 0; - Samples[nins].nLength = len; - Samples[nins].nLoopStart = loopstart; - Samples[nins].nLoopEnd = loopend; - if (loopend) Samples[nins].uFlags |= CHN_LOOP; - memcpy(m_szNames[nins], psmp->filename, 13); - Samples[nins].nVolume = 256; - Samples[nins].nGlobalVol = 64; - Samples[nins].nPan = 128; + Samples[nSmp].nLength = len; + Samples[nSmp].nLoopStart = loopstart; + Samples[nSmp].nLoopEnd = loopend; + if (loopend) Samples[nSmp].uFlags |= CHN_LOOP; + memcpy(m_szNames[nSmp], psmp->filename, 13); + SpaceToNullStringFixed(m_szNames[nSmp], 13); + Samples[nSmp].nVolume = 256; + Samples[nSmp].nGlobalVol = 64; + Samples[nSmp].nPan = 128; } // Song Message m_lpszSongComments = new char[109]; Modified: trunk/OpenMPT/soundlib/Load_ams.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ams.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_ams.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -88,6 +88,7 @@ if (dwMemPos + tmp + 1 >= dwMemLength) return true; tmp2 = (tmp < 32) ? tmp : 31; if (tmp2) memcpy(m_szNames[0], lpStream+dwMemPos, tmp2); + SpaceToNullStringFixed(m_szNames[0], tmp2); m_szNames[0][tmp2] = 0; dwMemPos += tmp; // Read sample names @@ -97,9 +98,10 @@ tmp = lpStream[dwMemPos++]; tmp2 = (tmp < 32) ? tmp : 31; if (tmp2) memcpy(m_szNames[sNam], lpStream+dwMemPos, tmp2); + SpaceToNullStringFixed(m_szNames[sNam], tmp2); dwMemPos += tmp; } - // Skip Channel names + // Read Channel names for (UINT cNam=0; cNam<m_nChannels; cNam++) { if (dwMemPos + 32 >= dwMemLength) return true; @@ -107,6 +109,7 @@ if ((chnnamlen) && (chnnamlen < MAX_CHANNELNAME)) { memcpy(ChnSettings[cNam].szName, lpStream + dwMemPos + 1, chnnamlen); + SpaceToNullStringFixed(ChnSettings[cNam].szName, chnnamlen); } dwMemPos += chnnamlen; } @@ -331,8 +334,8 @@ dwMemPos += sizeof(AMS2SONGHEADER); if (pfh->titlelen) { - memcpy(m_szNames, pfh->szTitle, pfh->titlelen); - m_szNames[0][pfh->titlelen] = 0; + memcpy(m_szNames[0], pfh->szTitle, pfh->titlelen); + SpaceToNullStringFixed(m_szNames[0], pfh->titlelen); } m_nType = MOD_TYPE_AMS; m_nChannels = 32; @@ -410,6 +413,7 @@ if ((psmp) && (smpnamelen) && (smpnamelen <= 22)) { memcpy(m_szNames[smpmap[ismp]], lpStream+dwMemPos+1, smpnamelen); + SpaceToNullStringFixed(m_szNames[smpmap[ismp]], smpnamelen); } dwMemPos += smpnamelen + 1; if (psmp) @@ -452,6 +456,7 @@ if ((chnnamlen) && (chnnamlen < MAX_CHANNELNAME)) { memcpy(ChnSettings[i].szName, lpStream+dwMemPos+1, chnnamlen); + SpaceToNullStringFixed(ChnSettings[i].szName, chnnamlen); } dwMemPos += chnnamlen + 1; if (dwMemPos + chnnamlen + 256 >= dwMemLength) return TRUE; @@ -487,7 +492,7 @@ { char s[MAX_PATTERNNAME]; memcpy(s, lpStream+dwMemPos+3, patnamlen); - s[patnamlen] = 0; + SpaceToNullStringFixed(s, patnamlen); SetPatternName(ipat, s); } if(Patterns.Insert(ipat, numrows)) return TRUE; Modified: trunk/OpenMPT/soundlib/Load_far.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_far.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_far.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -88,6 +88,8 @@ m_nDefaultGlobalVolume = 256; memcpy(m_szNames[0], pmh1->songname, 31); + SpaceToNullStringFixed(m_szNames[0], 31); + // Channel Setting for (UINT nchpan=0; nchpan<16; nchpan++) { @@ -248,6 +250,7 @@ dwMemPos += sizeof(FARSAMPLE); m_nSamples = ismp + 1; memcpy(m_szNames[ismp+1], pfs->samplename, 31); + SpaceToNullStringFixed(m_szNames[ismp + 1], 31); const DWORD length = LittleEndian( pfs->length ); pSmp->nLength = length; pSmp->nLoopStart = LittleEndian(pfs->reppos) ; Modified: trunk/OpenMPT/soundlib/Load_gdm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_gdm.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -80,11 +80,6 @@ (pHeader->DOSEOF[0] != 13 || pHeader->DOSEOF[1] != 10 || pHeader->DOSEOF[2] != 26) || //CR+LF+EOF (LittleEndian(pHeader->ID2) != 0x53464D47)) return false; //GMFS - // song name - memset(m_szNames, 0, sizeof(m_szNames)); - memcpy(m_szNames[0], pHeader->SongTitle, 32); - SetNullTerminator(m_szNames[0]); - // there are no other format versions... if(pHeader->FormMajorVer != 1 || pHeader->FormMinorVer != 0) { @@ -94,6 +89,11 @@ // interesting question: Is TrackID, TrackMajorVer, TrackMinorVer relevant? The only TrackID should be 0 - 2GDM.exe, so the answer would be no. + // song name + memset(m_szNames, 0, sizeof(m_szNames)); + memcpy(m_szNames[0], pHeader->SongTitle, 32); + SpaceToNullStringFixed(m_szNames[0], 31); + // read channel pan map... 0...15 = channel panning, 16 = surround channel, 255 = channel does not exist m_nChannels = 32; for(CHANNELINDEX i = 0; i < 32; i++) @@ -179,15 +179,16 @@ // read samples m_nSamples = pHeader->NOS + 1; - for(UINT iSmp = 1; iSmp <= m_nSamples; iSmp++) + for(SAMPLEINDEX iSmp = 1; iSmp <= m_nSamples; iSmp++) { const PGDMSAMPLEHEADER pSample = (PGDMSAMPLEHEADER)(lpStream + iSamHeadOffset + (iSmp - 1) * sizeof(GDMSAMPLEHEADER)); // sample header memcpy(m_szNames[iSmp], pSample->SamName, 32); - SetNullTerminator(m_szNames[iSmp]); + SpaceToNullStringFixed(m_szNames[iSmp], 31); memcpy(Samples[iSmp].filename, pSample->FileName, 12); + SpaceToNullStringFixed(Samples[iSmp].filename, 12); Samples[iSmp].nC5Speed = LittleEndianW(pSample->C4Hertz); Samples[iSmp].nGlobalVol = 256; // not supported in this format Modified: trunk/OpenMPT/soundlib/Load_imf.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_imf.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_imf.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -288,8 +288,7 @@ // song name memset(m_szNames, 0, sizeof(m_szNames)); memcpy(m_szNames[0], hdr.title, 31); - m_szNames[0][31] = 0; - SetNullTerminator(m_szNames[0]); + SpaceToNullStringFixed(m_szNames[0], 31); if (hdr.flags & 1) m_dwSongFlags |= SONG_LINEARSLIDES; @@ -306,8 +305,8 @@ ChnSettings[nChn].nPan = hdr.channels[nChn].panning * 64 / 255; ChnSettings[nChn].nPan *= 4; - memcpy(&ChnSettings[nChn].szName[0], hdr.channels[nChn].name, 12); - SetNullTerminator(ChnSettings[nChn].szName); + memcpy(ChnSettings[nChn].szName, hdr.channels[nChn].name, 12); + SpaceToNullStringFixed(ChnSettings[nChn].szName, 12); // TODO: reverb/chorus? switch (hdr.channels[nChn].status) { @@ -475,8 +474,8 @@ pIns->nPPC = 5 * 12; SetDefaultInstrumentValues(pIns); - strncpy(pIns->name, imfins.name, 31); - pIns->name[31] = 0; + memcpy(pIns->name, imfins.name, 31); + SpaceToNullStringFixed(pIns->name, 31); if (imfins.smpnum) { for (BYTE cNote = 0; cNote < 120; cNote++) { @@ -512,9 +511,10 @@ return false; } - strncpy(pSample->filename, imfsmp.filename, 12); - pSample->filename[12] = 0; + memcpy(pSample->filename, imfsmp.filename, 12); + SpaceToNullStringFixed(pSample->filename, 12); strcpy(m_szNames[m_nSamples], pSample->filename); + blen = pSample->nLength = LittleEndian(imfsmp.length); pSample->nLoopStart = LittleEndian(imfsmp.loop_start); pSample->nLoopEnd = LittleEndian(imfsmp.loop_end); Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -250,6 +250,8 @@ const ITOLDINSTRUMENT *pis = (const ITOLDINSTRUMENT *)p; memcpy(pIns->name, pis->name, 26); memcpy(pIns->filename, pis->filename, 12); + SpaceToNullStringFixed(pIns->name, 26); + SpaceToNullStringFixed(pIns->filename, 12); pIns->nFadeOut = pis->fadeout << 6; pIns->nGlobalVol = 64; for (UINT j=0; j<NOTE_MAX; j++) @@ -290,6 +292,8 @@ const ITINSTRUMENT *pis = (const ITINSTRUMENT *)p; memcpy(pIns->name, pis->name, 26); memcpy(pIns->filename, pis->filename, 12); + SpaceToNullStringFixed(pIns->name, 26); + SpaceToNullStringFixed(pIns->filename, 12); if (pis->mpr<=128) pIns->nMidiProgram = pis->mpr; pIns->nMidiChannel = pis->mch; @@ -941,8 +945,10 @@ if (pifh->flags & 0x20) m_dwSongFlags |= SONG_ITCOMPATMODE; if ((pifh->flags & 0x80) || (pifh->special & 0x08)) m_dwSongFlags |= SONG_EMBEDMIDICFG; if (pifh->flags & 0x1000) m_dwSongFlags |= SONG_EXFILTERRANGE; + memcpy(m_szNames[0], pifh->songname, 26); - m_szNames[0][26] = 0; + SpaceToNullStringFixed(m_szNames[0], 26); + // Global Volume if (pifh->globalvol) { @@ -1208,6 +1214,7 @@ { MODSAMPLE *pSmp = &Samples[nsmp+1]; memcpy(pSmp->filename, pis->filename, 12); + SpaceToNullStringFixed(pSmp->filename, 12); pSmp->uFlags = 0; pSmp->nLength = 0; pSmp->nLoopStart = pis->loopbegin; @@ -1258,17 +1265,10 @@ // -! NEW_FEATURE#0027 } } - memcpy(m_szNames[nsmp+1], pis->name, 26); + memcpy(m_szNames[nsmp + 1], pis->name, 26); + SpaceToNullStringFixed(m_szNames[nsmp + 1], 26); } - for (UINT ncu=0; ncu<MAX_BASECHANNELS; ncu++) - { - if (ncu>=m_nChannels) - { - ChnSettings[ncu].nVolume = 64; - ChnSettings[ncu].dwFlags &= ~CHN_MUTE; - } - } m_nMinPeriod = 8; m_nMaxPeriod = 0xF000; @@ -1309,11 +1309,7 @@ } UINT len = *((WORD *)(lpStream+patpos[npat])); UINT rows = *((WORD *)(lpStream+patpos[npat]+2)); -// -> CODE#0008 -// -> DESC="#define to set pattern size" -// if ((rows < 4) || (rows > 256)) continue; if ((rows < GetModSpecifications().patternRowsMin) || (rows > GetModSpecifications().patternRowsMax)) continue; -// -> BEHAVIOUR_CHANGE#0008 if (patpos[npat]+8+len > dwMemLength) continue; if(Patterns.Insert(npat, rows)) continue; Modified: trunk/OpenMPT/soundlib/Load_mdl.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_mdl.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -229,6 +229,8 @@ #endif pmib = (MDLINFOBLOCK *)(lpStream+dwMemPos); memcpy(m_szNames[0], pmib->songname, 31); + SpaceToNullStringFixed(m_szNames[0], 31); + norders = pmib->norders; if (norders > MAX_ORDERS) norders = MAX_ORDERS; m_nRestartPos = pmib->repeatpos; @@ -328,6 +330,8 @@ MODINSTRUMENT *pIns = Instruments[nins]; memset(pIns, 0, sizeof(MODINSTRUMENT)); memcpy(pIns->name, lpStream+dwPos+2, 32); + SpaceToNullStringFixed(pIns->name, 31); + pIns->nGlobalVol = 64; pIns->nPPC = 5*12; SetDefaultInstrumentValues(pIns); @@ -413,6 +417,8 @@ MODSAMPLE *pSmp = &Samples[nins]; memcpy(m_szNames[nins], lpStream+dwPos+1, 31); memcpy(pSmp->filename, lpStream+dwPos+33, 8); + SpaceToNullStringFixed(m_szNames[nins], 31); + SpaceToNullStringFixed(pSmp->filename, 8); const BYTE *p = lpStream+dwPos+41; if (pmsh->version > 0) { Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -716,6 +716,7 @@ { if (songnamelen > 31) songnamelen = 31; memcpy(m_szNames[0], lpStream+songname, songnamelen); + SpaceToNullStringFixed(m_szNames[0], songnamelen); } // Sample Names DWORD smpinfoex = BigEndian(pmex->iinfo); @@ -733,6 +734,7 @@ for (UINT i=0; i<ientries; i++) if (i < m_nSamples) { memcpy(m_szNames[i+1], psznames + i*ientrysz, maxnamelen); + SpaceToNullStringFixed(m_szNames[i + 1], maxnamelen); } } } @@ -762,8 +764,8 @@ if (trknamelen > MAX_CHANNELNAME) trknamelen = MAX_CHANNELNAME; if ((trknameofs) && (trknameofs < dwMemLength - trknamelen)) { - memcpy(ChnSettings[i].szName, (LPCSTR)(lpStream+trknameofs), MAX_CHANNELNAME); - SetNullTerminator(ChnSettings[i].szName); + memcpy(ChnSettings[i].szName, (LPCSTR)(lpStream+trknameofs), trknamelen); + SpaceToNullStringFixed(ChnSettings[i].szName, trknamelen); } } } Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -256,7 +256,7 @@ UINT loopstart, looplen; memcpy(m_szNames[i], pms->name, 22); - m_szNames[i][22] = 0; + SpaceToNullStringFixed(m_szNames[i], 22); psmp->uFlags = 0; psmp->nLength = BigEndianW(pms->length)*2; dwTotalSampleLen += psmp->nLength; @@ -347,7 +347,8 @@ m_nDefaultTempo = 125; m_nMinPeriod = 14 << 2; m_nMaxPeriod = 3424 << 2; - memcpy(m_szNames, lpStream, 20); + memcpy(m_szNames[0], lpStream, 20); + SpaceToNullStringFixed(m_szNames[0], 20); // Setup channel pan positions and volume SetupMODPanning(); Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -210,7 +210,8 @@ Order[iOrd] = (PATTERNINDEX)pfh->Orders[iOrd]; } memcpy(m_szNames[0], pfh->szSongName, 32); - m_szNames[0][31] = 0; + SpaceToNullStringFixed(m_szNames[0], 31); + dwMemPos = sizeof(MT2FILEHEADER); nDrumDataLen = *(WORD *)(lpStream + dwMemPos); dwDrumDataPos = dwMemPos + 2; @@ -407,7 +408,7 @@ { memset(pIns, 0, sizeof(MODINSTRUMENT)); memcpy(pIns->name, pmi->szName, 32); - SetNullTerminator(pIns->name); + SpaceToNullStringFixed(pIns->name, 32); pIns->nGlobalVol = 64; pIns->nPan = 128; for (UINT i=0; i<NOTE_MAX; i++) @@ -539,6 +540,7 @@ if (iSmp < MAX_SAMPLES) { memcpy(m_szNames[iSmp], pms->szName, 31); + SpaceToNullStringFixed(m_szNames[iSmp], 31); } if (pms->dwDataLen > 0) { Modified: trunk/OpenMPT/soundlib/Load_mtm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mtm.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_mtm.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -59,19 +59,20 @@ || (pmh->numsamples >= MAX_SAMPLES) || (!pmh->numsamples) || (!pmh->numtracks) || (!pmh->numchannels) || (!pmh->lastpattern) || (pmh->lastpattern > MAX_PATTERNS)) return false; - strncpy(m_szNames[0], pmh->songname, 20); - m_szNames[0][20] = 0; - if (dwMemPos + 37*pmh->numsamples + 128 + 192*pmh->numtracks + memcpy(m_szNames[0], pmh->songname, 20); + SpaceToNullStringFixed(m_szNames[0], 20); + + if (dwMemPos + 37 * pmh->numsamples + 128 + 192 * pmh->numtracks + 64 * (pmh->lastpattern+1) + pmh->commentsize >= dwMemLength) return false; m_nType = MOD_TYPE_MTM; m_nSamples = pmh->numsamples; m_nChannels = pmh->numchannels; // Reading instruments - for (UINT i=1; i<=m_nSamples; i++) + for (SAMPLEINDEX i = 1; i <= m_nSamples; i++) { MTMSAMPLE *pms = (MTMSAMPLE *)(lpStream + dwMemPos); - strncpy(m_szNames[i], pms->samplename, 22); - m_szNames[i][22] = 0; + memcpy(m_szNames[i], pms->samplename, 22); + SpaceToNullStringFixed(m_szNames[i], 22); Samples[i].nVolume = pms->volume << 2; Samples[i].nGlobalVol = 64; DWORD len = pms->length; Modified: trunk/OpenMPT/soundlib/Load_okt.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_okt.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_okt.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -69,6 +69,7 @@ MODSAMPLE *pSmp = &Samples[smp]; memcpy(m_szNames[smp], psmp->name, 20); + SpaceToNullStringFixed(m_szNames[smp], 20); pSmp->uFlags = 0; pSmp->nLength = BigEndian(psmp->length) & ~1; pSmp->nLoopStart = BigEndianW(psmp->loopstart); Modified: trunk/OpenMPT/soundlib/Load_psm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_psm.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_psm.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -169,7 +169,7 @@ { case 0x4C544954: // "TITL" - Song Title memcpy(m_szNames[0], lpStream + dwMemPos, (chunkSize < 31) ? chunkSize : 31); - m_szNames[0][31] = 0; + SpaceToNullStringFixed(m_szNames[0], 31); break; case 0x54464453: // "SDFT" - Format info (song data starts here) @@ -203,7 +203,7 @@ PSMSUBSONG subsong; subsong.restartPos = (ORDERINDEX)Order.size(); // restart order "offset": current orderlist length memcpy(subsong.songName, &pSong->songType, 9); // subsong name - subsong.songName[9] = 0; + SpaceToNullStringFixed(subsong.songName, 9); DWORD dwChunkPos = dwMemPos + sizeof(PSMSONGHEADER); @@ -432,9 +432,9 @@ SAMPLEINDEX smp = (SAMPLEINDEX)(LittleEndianW(pSample->sampleNumber) + 1); m_nSamples = max(m_nSamples, smp); memcpy(m_szNames[smp], pSample->sampleName, 31); - m_szNames[smp][31] = 0; + SpaceToNullStringFixed(m_szNames[smp], 31); memcpy(Samples[smp].filename, pSample->fileName, 8); - Samples[smp].filename[8] = 0; + SpaceToNullStringFixed(Samples[smp].filename, 8); Samples[smp].nGlobalVol = 0x40; Samples[smp].nC5Speed = LittleEndianW(pSample->C5Freq); @@ -456,9 +456,9 @@ SAMPLEINDEX smp = (SAMPLEINDEX)(LittleEndianW(pSample->sampleNumber) + 1); m_nSamples = max(m_nSamples, smp); memcpy(m_szNames[smp], pSample->sampleName, 31); - m_szNames[smp][31] = 0; + SpaceToNullStringFixed(m_szNames[smp], 31); memcpy(Samples[smp].filename, pSample->fileName, 8); - Samples[smp].filename[8] = 0; + SpaceToNullStringFixed(Samples[smp].filename, 8); Samples[smp].nGlobalVol = 0x40; Samples[smp].nC5Speed = LittleEndianW(pSample->C5Freq); @@ -893,7 +893,7 @@ memset(m_szNames, 0, sizeof(m_szNames)); memcpy(m_szNames[0], shdr->songName, 31); - m_szNames[0][31] = 0; + SpaceToNullStringFixed(m_szNames[0], 31); // Read orders dwMemPos = LittleEndian(shdr->orderOffset); @@ -933,9 +933,9 @@ m_nSamples = max(m_nSamples, iSmp); memcpy(m_szNames[iSmp], smphdr->name, 24); - m_szNames[iSmp][24] = 0; + SpaceToNullStringFixed(m_szNames[iSmp], 24); memcpy(Samples[iSmp].filename, smphdr->filename, 13); - Samples[iSmp].filename[13] = 0; + SpaceToNullStringFixed(Samples[iSmp].filename, 13); Samples[iSmp].nLength = LittleEndian(smphdr->length); Samples[iSmp].nLoopStart = LittleEndian(smphdr->loopStart); Modified: trunk/OpenMPT/soundlib/Load_ptm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ptm.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_ptm.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -89,7 +89,8 @@ || (!pfh.npatterns) || (pfh.npatterns > 128) || (SIZEOF_PTMFILEHEADER+pfh.nsamples*SIZEOF_PTMSAMPLE >= (int)dwMemLength)) return false; memcpy(m_szNames[0], pfh.songname, 28); - m_szNames[0][28] = 0; + SpaceToNullStringFixed(m_szNames[0], 28); + m_nType = MOD_TYPE_PTM; m_nChannels = pfh.nchannels; m_nSamples = (pfh.nsamples < MAX_SAMPLES) ? pfh.nsamples : MAX_SAMPLES-1; @@ -109,7 +110,9 @@ lstrcpyn(m_szNames[ismp+1], psmp->samplename, 28); memcpy(pSmp->filename, psmp->filename, 12); - pSmp->filename[12] = 0; + SpaceToNullStringFixed(m_szNames[ismp + 1], 28); + SpaceToNullStringFixed(pSmp->filename, 12); + pSmp->nGlobalVol = 64; pSmp->nPan = 128; pSmp->nVolume = psmp->volume << 2; Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -266,6 +266,7 @@ m_nType = MOD_TYPE_S3M; memset(m_szNames,0,sizeof(m_szNames)); memcpy(m_szNames[0], psfh.name, 28); + SpaceToNullStringFixed(m_szNames[0], 28); // Speed m_nDefaultSpeed = psfh.speed; if (!m_nDefaultSpeed) m_nDefaultSpeed = 6; @@ -335,12 +336,17 @@ { UINT nInd = ((DWORD)ptr[iSmp-1])*16; if ((!nInd) || (nInd + 0x50 > dwMemLength)) continue; + memcpy(s, lpStream+nInd, 0x50); memcpy(Samples[iSmp].filename, s+1, 12); + SpaceToNullStringFixed(Samples[iSmp].filename, 12); + insflags[iSmp-1] = s[0x1F]; inspack[iSmp-1] = s[0x1E]; s[0x4C] = 0; lstrcpy(m_szNames[iSmp], (LPCSTR)&s[0x30]); + SpaceToNullStringFixed(m_szNames[iSmp], 28); + if ((s[0]==1) && (s[0x4E]=='R') && (s[0x4F]=='S')) { Samples[iSmp].nLength = CLAMP(LittleEndian(*((LPDWORD)(s + 0x10))), 4, MAX_SAMPLE_LENGTH); Modified: trunk/OpenMPT/soundlib/Load_stm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_stm.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_stm.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -70,6 +70,7 @@ || ((_strnicmp(phdr->trackername, "!SCREAM!", 8)) && (_strnicmp(phdr->trackername, "BMOD2STM", 8)))) return false; memcpy(m_szNames[0], phdr->songname, 20); + SpaceToNullStringFixed(m_szNames[0], 20); // Read STM header m_nType = MOD_TYPE_STM; m_nSamples = 31; @@ -97,6 +98,8 @@ STMSAMPLE *pStm = &phdr->sample[nIns]; // STM sample data memcpy(pIns->filename, pStm->filename, 13); memcpy(m_szNames[nIns+1], pStm->filename, 12); + SpaceToNullStringFixed(pIns->filename, 12); + SpaceToNullStringFixed(m_szNames[nIns + 1], 12); pIns->nC5Speed = LittleEndianW(pStm->c2spd); pIns->nGlobalVol = 64; pIns->nVolume = pStm->volume << 2; Modified: trunk/OpenMPT/soundlib/Load_ult.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_ult.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_ult.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -61,6 +61,7 @@ m_nDefaultSpeed = 6; m_nDefaultTempo = 125; memcpy(m_szNames[0], pmh->songtitle, 31); + SpaceToNullStringFixed(m_szNames[0], 31); // read songtext dwMemPos = sizeof(ULTHEADER); if ((pmh->reserved) && (dwMemPos + pmh->reserved * 32 < dwMemLength)) @@ -91,6 +92,8 @@ MODSAMPLE *pSmp = &Samples[ins]; memcpy(m_szNames[ins], pus->samplename, 31); memcpy(pSmp->filename, pus->dosname, 12); + SpaceToNullStringFixed(m_szNames[ins], 31); + SpaceToNullStringFixed(pSmp->filename, 12); pSmp->nLoopStart = pus->loopstart; pSmp->nLoopEnd = pus->loopend; pSmp->nLength = pus->sizeend - pus->sizestart; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -257,6 +257,7 @@ // look for null-terminated song name - that's most likely a tune made with modplug for(int i = 0; i < 20; i++) if(lpStream[17 + i] == 0) bProbablyMadeWithModPlug = true; + SpaceToNullStringFixed(m_szNames[0], 20); // load and convert header memcpy(&xmheader, lpStream + 58, sizeof(XMFILEHEADER)); @@ -323,6 +324,7 @@ Instruments[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; memcpy(Instruments[iIns]->name, pih->name, 22); + SpaceToNullStringFixed(Instruments[iIns]->name, 22); if ((nsamples = pih->samples) > 0) { @@ -524,7 +526,7 @@ if (!xmss.looplen) xmss.type &= ~3; UINT imapsmp = samplemap[ins]; memcpy(m_szNames[imapsmp], xmss.name, 22); - m_szNames[imapsmp][22] = 0; + SpaceToNullStringFixed(m_szNames[imapsmp], 22); MODSAMPLE *pSmp = &Samples[imapsmp]; pSmp->nLength = (xmss.samplen > MAX_SAMPLE_LENGTH) ? MAX_SAMPLE_LENGTH : xmss.samplen; pSmp->nLoopStart = xmss.loopstart; @@ -553,7 +555,7 @@ pSmp->nVibDepth = xmsh.vibdepth; pSmp->nVibRate = xmsh.vibrate; memcpy(pSmp->filename, xmss.name, 22); - pSmp->filename[21] = 0; + SpaceToNullStringFixed(pSmp->filename, 21); } #if 0 if ((xmsh.reserved2 > nsamples) && (xmsh.reserved2 <= 16)) Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -30,7 +30,7 @@ #define UNRAR_SUPPORT #define UNLHA_SUPPORT #define ZIPPED_MOD_SUPPORT -LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx|gdm" +LPCSTR glpszModExtensions = "mod|s3m|xm|it|stm|nst|ult|669|wow|mtm|med|far|mdl|ams|dsm|amf|okt|dmf|ptm|psm|mt2|umx|gdm|imf|j2b" #ifndef NO_UNMO3_SUPPORT "|mo3" #endif Modified: trunk/OpenMPT/soundlib/load_j2b.cpp =================================================================== --- trunk/OpenMPT/soundlib/load_j2b.cpp 2009-10-10 00:03:35 UTC (rev 393) +++ trunk/OpenMPT/soundlib/load_j2b.cpp 2009-10-11 16:07:45 UTC (rev 394) @@ -238,6 +238,7 @@ bool bIsAM; // false: AMFF, true: AM + ASSERT_CAN_READ(4); if(LittleEndian(*(DWORD *)(lpStream + dwMemPos)) == 0x46464D41) bIsAM = false; // "AMFF" else if(LittleEndian(*(DWORD *)(lpStream + dwMemPos)) == 0x20204D41) bIsAM = true; // "AM " else return false; @@ -266,7 +267,7 @@ ASSERT_CAN_READ_CHUNK(mainchunk->channels); memcpy(m_szNames[0], mainchunk->songname, 32); - SetNullTerminator(m_szNames[0]); + SpaceToNullStringFixed(m_szNames[0], 31); m_dwSongFlags = SONG_ITOLDEFFECTS | SONG_ITCOMPATMODE; if(!(mainchunk->flags & 0x01)) m_dwSongFlags |= SONG_LINEARSLIDES; if(mainchunk->channels < 1) return false; @@ -277,30 +278,25 @@ m_nSamplePreAmp = m_nVSTiVolume = 48; m_nType = MOD_TYPE_IT; + // It seems like there's no way to differentiate between + // Muted and Surround channels (they're all 0xA0) - might + // be a limitation in mod2j2b. for(CHANNELINDEX nChn = 0; nChn < m_nChannels; nChn++) { + ChnSettings[nChn].nVolume = 64; + ChnSettings[nChn].nPan = 128; if(bIsAM) { if(lpStream[dwMemPos + nChn] > 128) - { - ChnSettings[nChn].nPan = 128; - ChnSettings[nChn].nVolume = 0; - } else - { + ChnSettings[nChn].dwFlags = CHN_MUTE; + else ChnSettings[nChn].nPan = lpStream[dwMemPos + nChn] << 1; - ChnSettings[nChn].nVolume = 64; - } } else { if(lpStream[dwMemPos + nChn] >= 128) - { - ChnSettings[nChn].nPan = 128; - ChnSettings[nChn].nVolume = 0; - } else - { + ChnSettings[nChn].dwFlags = CHN_MUTE; + else ChnSettings[nChn].nPan = lpStream[dwMemPos + nChn] << 2; - ChnSettings[nChn].nVolume = 64; - } } } dwMemPos += mainchunk->channels; @@ -330,7 +326,7 @@ m_nSamples = max(m_nSamples, nSmp); memcpy(m_szNames[nSmp], inschunk->name, 28); - m_szNames[nSmp][28] = 0; + SpaceToNullStringFixed(m_szNames[nSmp], 28); ASSERT_CAN_READ_CHUNK(sizeof(AMFFCHUNK_SAMPLE)); AMFFCHUNK_SAMPLE *smpchunk = (AMFFCHUNK_SAMPLE *)(lpStream + dwMemPos); @@ -339,7 +335,7 @@ if(smpchunk->signature != 0x504D4153) break; // SAMP memcpy(m_szNames[nSmp], smpchunk->name, 28); - m_szNames[nSmp][28] = 0; + SpaceToNullStringFixed(m_szNames[nSmp], 28); Samples[nSmp].nPan = smpchunk->pan << 2; Samples[nSmp].nVolume = smpchunk->volume << 2; @@ -389,7 +385,7 @@ m_nSamples = max(m_nSamples, nSmp); memcpy(m_szNames[nSmp], instheadchunk->name, 32); - m_szNames[nSmp][32] = 0; + SpaceToNullStringFixed(m_szNames[nSmp], 31); ASSERT_CAN_READ_CHUNK(sizeof(RIFFCHUNK)); instchunk = (RIFFCHUNK *)(lpStream + dwMemPos); @@ -407,7 +403,7 @@ if(smpchunk->signature != 0x504D4153) break; // SAMP memcpy(m_szNames[nSmp], smpchunk->name, 32); - m_szNames[nSmp][32] = 0; + SpaceToNullStringFixed(m_szNames[nSmp], 31); if(LittleEndianW(smpchunk->pan) > 0x7FFF || LittleEndianW(smpchunk->volume) > 0x7FFF) break; @@ -429,7 +425,7 @@ if(LittleEndianW(smpchunk->flags) & 0x20) Samples[nSmp].uFlags |= CHN_PANNING; - dwMemPos += LittleEndian(smpchunk->headsize); + dwMemPos += LittleEndian(smpchunk->headsize) + 12; // doesn't include the 3 first DWORDs dwMemPos += ReadSample(&Samples[nSmp], (LittleEndianW(smpchunk->flags) & 0x04) ? RS_PCM16S : RS_PCM8S, (LPCSTR)(lpStream + dwMemPos), dwMemLength - dwMemPos); } break; @@ -471,7 +467,7 @@ // header is valid, now unpack the RIFF AM file using inflate DWORD destSize = LittleEndian(header->unpacked_length); Bytef *bOutput = new Bytef[destSize]; - int nRetVal = uncompress(bOutput, &destSize, &lpStream[dwMemPos], LittleEndian(header->unpacked_length)); + int nRetVal = uncompress(bOutput, &destSize, &lpStream[dwMemPos], LittleEndian(header->packed_length)); bool bResult = false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |