mirror of
https://github.com/cookiengineer/audacity
synced 2025-12-15 00:51:21 +01:00
Fix possible memory leak in use of overrides of BlockFile::CalcSummary
This commit is contained in:
@@ -337,14 +337,12 @@ int ODDecodeBlockFile::WriteODDecodeBlockFile()
|
||||
sampleData.ptr(),
|
||||
mLen,
|
||||
mFormat,
|
||||
NULL);//summaryData);
|
||||
NULL);
|
||||
wxASSERT(bSuccess); // TODO: Handle failure here by alert to user and undo partial op.
|
||||
wxUnusedVar(bSuccess);
|
||||
|
||||
mFileNameMutex.Unlock();
|
||||
|
||||
// delete [] (char *) summaryData;
|
||||
|
||||
|
||||
mDataAvailableMutex.Lock();
|
||||
mDataAvailable=true;
|
||||
@@ -394,9 +392,10 @@ wxFileName ODDecodeBlockFile::GetFileName()
|
||||
/// @param len The length of the sample data
|
||||
/// @param format The format of the sample data.
|
||||
void *ODDecodeBlockFile::CalcSummary(samplePtr buffer, sampleCount len,
|
||||
sampleFormat format)
|
||||
sampleFormat format, ArrayOf<char> &cleanup)
|
||||
{
|
||||
char* localFullSummary = new char[mSummaryInfo.totalSummaryBytes];
|
||||
cleanup.reinit(mSummaryInfo.totalSummaryBytes);
|
||||
char* localFullSummary = cleanup.get();
|
||||
|
||||
memcpy(localFullSummary, bheaderTag, bheaderTagLen);
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ class ODDecodeBlockFile final : public SimpleBlockFile
|
||||
|
||||
// void WriteSimpleBlockFile() override;
|
||||
void *CalcSummary(samplePtr buffer, sampleCount len,
|
||||
sampleFormat format) override;
|
||||
sampleFormat format, ArrayOf<char> &cleanup) override;
|
||||
//The on demand type.
|
||||
unsigned int mType;
|
||||
|
||||
|
||||
@@ -424,13 +424,13 @@ void ODPCMAliasBlockFile::WriteSummary()
|
||||
SampleBuffer sampleData(mLen, floatSample);
|
||||
this->ReadData(sampleData.ptr(), floatSample, 0, mLen);
|
||||
|
||||
ArrayOf<char> cleanup;
|
||||
void *summaryData = CalcSummary(sampleData.ptr(), mLen,
|
||||
floatSample);
|
||||
floatSample, cleanup);
|
||||
|
||||
//summaryFile.Write(summaryData, mSummaryInfo.totalSummaryBytes);
|
||||
fwrite(summaryData, 1, mSummaryInfo.totalSummaryBytes, summaryFile);
|
||||
fclose(summaryFile);
|
||||
delete [] (char *) summaryData;
|
||||
|
||||
|
||||
// printf("write successful. filename: %s\n", fileNameChar);
|
||||
@@ -460,9 +460,10 @@ void ODPCMAliasBlockFile::WriteSummary()
|
||||
/// @param len The length of the sample data
|
||||
/// @param format The format of the sample data.
|
||||
void *ODPCMAliasBlockFile::CalcSummary(samplePtr buffer, sampleCount len,
|
||||
sampleFormat format)
|
||||
sampleFormat format, ArrayOf<char> &cleanup)
|
||||
{
|
||||
char* localFullSummary = new char[mSummaryInfo.totalSummaryBytes];
|
||||
cleanup.reinit(mSummaryInfo.totalSummaryBytes);
|
||||
char* localFullSummary = cleanup.get();
|
||||
|
||||
memcpy(localFullSummary, aheaderTag, aheaderTagLen);
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ class ODPCMAliasBlockFile final : public PCMAliasBlockFile
|
||||
protected:
|
||||
void WriteSummary() override;
|
||||
void *CalcSummary(samplePtr buffer, sampleCount len,
|
||||
sampleFormat format) override;
|
||||
sampleFormat format, ArrayOf<char> &cleanup) override;
|
||||
|
||||
private:
|
||||
//Thread-safe versions
|
||||
|
||||
@@ -123,8 +123,9 @@ SimpleBlockFile::SimpleBlockFile(wxFileName baseFileName,
|
||||
mCache.sampleData = new char[sampleLen * SAMPLE_SIZE(format)];
|
||||
memcpy(mCache.sampleData,
|
||||
sampleData, sampleLen * SAMPLE_SIZE(format));
|
||||
ArrayOf<char> cleanup;
|
||||
void* summaryData = BlockFile::CalcSummary(sampleData, sampleLen,
|
||||
format);
|
||||
format, cleanup);
|
||||
mCache.summaryData = new char[mSummaryInfo.totalSummaryBytes];
|
||||
memcpy(mCache.summaryData, summaryData,
|
||||
(size_t)mSummaryInfo.totalSummaryBytes);
|
||||
@@ -207,8 +208,11 @@ bool SimpleBlockFile::WriteSimpleBlockFile(
|
||||
header.channels = 1;
|
||||
|
||||
// Write the file
|
||||
ArrayOf<char> cleanup;
|
||||
if (!summaryData)
|
||||
summaryData = /*BlockFile::*/CalcSummary(sampleData, sampleLen, format); //mchinen:allowing virtual override of calc summary for ODDecodeBlockFile.
|
||||
summaryData = /*BlockFile::*/CalcSummary(sampleData, sampleLen, format, cleanup);
|
||||
//mchinen:allowing virtual override of calc summary for ODDecodeBlockFile.
|
||||
// PRL: cleanup fixes a possible memory leak!
|
||||
|
||||
size_t nBytesToWrite = sizeof(header);
|
||||
size_t nBytesWritten = file.Write(&header, nBytesToWrite);
|
||||
|
||||
Reference in New Issue
Block a user