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.
This commit is contained in:
parent
b6e9030f6f
commit
abe05d6d7f
1 changed files with 15 additions and 11 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue