From abe05d6d7fc2c741cdae2c0b107451de45c1ccdd Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Wed, 22 Sep 2010 06:33:47 +0000 Subject: [PATCH] jack: fixed segmentation fault caused by PA Jack implementation if Pa_Initialize is called after Pa_Terminate due to bad pointer usage by realloc() call which was previously freed() in Pa_Terminate call. Many thanks to RJ Ryan for reporting, debugging and providing the solution for this bug. --- src/hostapi/jack/pa_jack.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c index a73507e..24a56d9 100644 --- a/src/hostapi/jack/pa_jack.c +++ b/src/hostapi/jack/pa_jack.c @@ -71,8 +71,6 @@ #include "pa_ringbuffer.h" #include "pa_debugprint.h" -static int aErr_; -static PaError paErr_; /* For use with ENSURE_PA */ static pthread_t mainThread_; static char *jackErr_ = NULL; static const char* clientName_ = "PortAudio"; @@ -83,15 +81,17 @@ static const char* clientName_ = "PortAudio"; /* Check PaError */ #define ENSURE_PA(expr) \ do { \ - if( (paErr_ = (expr)) < paNoError ) \ + PaError paErr; \ + if( (paErr = (expr)) < paNoError ) \ { \ - if( (paErr_) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \ + if( (paErr) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \ { \ - if (! jackErr_ ) jackErr_ = "unknown error";\ - PaUtil_SetLastHostErrorInfo( paJACK, -1, jackErr_ ); \ + const char *err = jackErr_; \ + if (! err ) err = "unknown error"; \ + PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \ } \ PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ - result = paErr_; \ + result = paErr; \ goto error; \ } \ } while( 0 ) @@ -102,8 +102,9 @@ static const char* clientName_ = "PortAudio"; { \ if( (code) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \ { \ - if (!jackErr_) jackErr_ = "unknown error";\ - PaUtil_SetLastHostErrorInfo( paJACK, -1, jackErr_ ); \ + const char *err = jackErr_; \ + if (!err) err = "unknown error"; \ + PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \ } \ PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ result = (code); \ @@ -112,8 +113,10 @@ static const char* clientName_ = "PortAudio"; } while( 0 ) #define ASSERT_CALL(expr, success) \ - aErr_ = (expr); \ - assert( aErr_ == success ); + do { \ + int err = (expr); \ + assert( err == success ); \ + } while( 0 ) /* * Functions that directly map to the PortAudio stream interface @@ -826,6 +829,7 @@ static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) PaUtil_FreeMemory( jackHostApi ); free( jackErr_ ); + jackErr_ = NULL; } static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, -- 2.43.0