From 18a7f2829db1335b536ad15b23d5719acd759204 Mon Sep 17 00:00:00 2001 From: Shmuel H Date: Mon, 7 May 2018 10:40:02 +0300 Subject: [PATCH] SamplePlayHandle: Fix double-free, when the handle thinks it has an audioPort but it it is really someone else's. --- include/SamplePlayHandle.h | 2 +- src/core/SamplePlayHandle.cpp | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/include/SamplePlayHandle.h b/include/SamplePlayHandle.h index 9a051ec7b1a..17843379bbc 100644 --- a/include/SamplePlayHandle.h +++ b/include/SamplePlayHandle.h @@ -38,7 +38,7 @@ class AudioPort; class SamplePlayHandle : public PlayHandle { public: - SamplePlayHandle( SampleBuffer* sampleBuffer ); + SamplePlayHandle(SampleBuffer* sampleBuffer , bool shouldCreateAudioPort=true); SamplePlayHandle( const QString& sampleFile ); SamplePlayHandle( SampleTCO* tco ); virtual ~SamplePlayHandle(); diff --git a/src/core/SamplePlayHandle.cpp b/src/core/SamplePlayHandle.cpp index 549a6c3a549..9fbe76ac327 100644 --- a/src/core/SamplePlayHandle.cpp +++ b/src/core/SamplePlayHandle.cpp @@ -32,25 +32,26 @@ -SamplePlayHandle::SamplePlayHandle( SampleBuffer* sampleBuffer ) : +SamplePlayHandle::SamplePlayHandle( SampleBuffer* sampleBuffer , bool shouldCreateAudioPort) : PlayHandle( TypeSamplePlayHandle ), m_sampleBuffer( sharedObject::ref( sampleBuffer ) ), m_doneMayReturnTrue( true ), m_frame( 0 ), - m_ownAudioPort( true ), + m_ownAudioPort( shouldCreateAudioPort ), m_defaultVolumeModel( DefaultVolume, MinVolume, MaxVolume, 1 ), m_volumeModel( &m_defaultVolumeModel ), m_track( NULL ), m_bbTrack( NULL ) { - setAudioPort( new AudioPort( "SamplePlayHandle", false ) ); + if (shouldCreateAudioPort) + setAudioPort( new AudioPort( "SamplePlayHandle", false ) ); } SamplePlayHandle::SamplePlayHandle( const QString& sampleFile ) : - SamplePlayHandle( new SampleBuffer( sampleFile ) ) + SamplePlayHandle( new SampleBuffer( sampleFile ) , false) { sharedObject::unref( m_sampleBuffer ); setAudioPort( new AudioPort( "SamplePlayHandle", false ) ); @@ -60,7 +61,7 @@ SamplePlayHandle::SamplePlayHandle( const QString& sampleFile ) : SamplePlayHandle::SamplePlayHandle( SampleTCO* tco ) : - SamplePlayHandle( tco->sampleBuffer() ) + SamplePlayHandle( tco->sampleBuffer() , false) { m_track = tco->getTrack(); setAudioPort( ( (SampleTrack *)tco->getTrack() )->audioPort() ); @@ -72,7 +73,7 @@ SamplePlayHandle::SamplePlayHandle( SampleTCO* tco ) : SamplePlayHandle::~SamplePlayHandle() { sharedObject::unref( m_sampleBuffer ); - if( m_ownAudioPort ) + if( m_ownAudioPort && audioPort ()) { delete audioPort(); }