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:
dmitrykos 2010-09-22 06:33:47 +00:00
commit abe05d6d7f

View file

@ -71,8 +71,6 @@
#include "pa_ringbuffer.h" #include "pa_ringbuffer.h"
#include "pa_debugprint.h" #include "pa_debugprint.h"
static int aErr_;
static PaError paErr_; /* For use with ENSURE_PA */
static pthread_t mainThread_; static pthread_t mainThread_;
static char *jackErr_ = NULL; static char *jackErr_ = NULL;
static const char* clientName_ = "PortAudio"; static const char* clientName_ = "PortAudio";
@ -83,15 +81,17 @@ static const char* clientName_ = "PortAudio";
/* Check PaError */ /* Check PaError */
#define ENSURE_PA(expr) \ #define ENSURE_PA(expr) \
do { \ 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";\ const char *err = jackErr_; \
PaUtil_SetLastHostErrorInfo( paJACK, -1, jackErr_ ); \ if (! err ) err = "unknown error"; \
PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \
} \ } \
PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \
result = paErr_; \ result = paErr; \
goto error; \ goto error; \
} \ } \
} while( 0 ) } while( 0 )
@ -102,8 +102,9 @@ static const char* clientName_ = "PortAudio";
{ \ { \
if( (code) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \ if( (code) == paUnanticipatedHostError && pthread_self() == mainThread_ ) \
{ \ { \
if (!jackErr_) jackErr_ = "unknown error";\ const char *err = jackErr_; \
PaUtil_SetLastHostErrorInfo( paJACK, -1, jackErr_ ); \ if (!err) err = "unknown error"; \
PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \
} \ } \
PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \
result = (code); \ result = (code); \
@ -112,8 +113,10 @@ static const char* clientName_ = "PortAudio";
} while( 0 ) } while( 0 )
#define ASSERT_CALL(expr, success) \ #define ASSERT_CALL(expr, success) \
aErr_ = (expr); \ do { \
assert( aErr_ == success ); int err = (expr); \
assert( err == success ); \
} while( 0 )
/* /*
* Functions that directly map to the PortAudio stream interface * Functions that directly map to the PortAudio stream interface
@ -826,6 +829,7 @@ static void Terminate( struct PaUtilHostApiRepresentation *hostApi )
PaUtil_FreeMemory( jackHostApi ); PaUtil_FreeMemory( jackHostApi );
free( jackErr_ ); free( jackErr_ );
jackErr_ = NULL;
} }
static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi,