summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2009-12-09 19:45:57 +0000
committerjstebbins <[email protected]>2009-12-09 19:45:57 +0000
commit8426cf2868de61bf8f688d549083a80e327ad1f8 (patch)
tree451794bafe7a10d27dee7f788fb01373b1f81542
parent44271b50ac71961be9bf7fb5eb960124c09a0eea (diff)
Avert a rare race condition.
A bad source can cause reader to call hb_stream_close before decavcodecviWork ever starts. This causes hb_ffmpeg_context to access an invalid pointer. So move the call to hb_ffmpeg_context to after we check for a 0 length buffer in decavcodecvoiWork since reader will have sent this to signal that it has reached the end of the stream. This does not eliminate the race condition, but it does make it much less likely to happen and fixes the specific case where we found this occuring. git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3020 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--libhb/decavcodec.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/libhb/decavcodec.c b/libhb/decavcodec.c
index f8a06992f..19bd56c45 100644
--- a/libhb/decavcodec.c
+++ b/libhb/decavcodec.c
@@ -1044,10 +1044,6 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
hb_buffer_t ** buf_out )
{
hb_work_private_t *pv = w->private_data;
- if ( ! pv->context )
- {
- init_ffmpeg_context( w );
- }
hb_buffer_t *in = *buf_in;
*buf_in = NULL;
@@ -1055,7 +1051,7 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
if ( in->size == 0 )
{
/* flush any frames left in the decoder */
- while ( decodeFrame( pv, NULL, 0 ) )
+ while ( pv->context && decodeFrame( pv, NULL, 0 ) )
{
}
flushDelayQueue( pv );
@@ -1064,6 +1060,11 @@ static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
return HB_WORK_DONE;
}
+ if ( ! pv->context )
+ {
+ init_ffmpeg_context( w );
+ }
+
int64_t pts = in->start;
if( pts >= 0 )
{