diff options
author | jstebbins <[email protected]> | 2009-12-09 19:45:57 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2009-12-09 19:45:57 +0000 |
commit | 8426cf2868de61bf8f688d549083a80e327ad1f8 (patch) | |
tree | 451794bafe7a10d27dee7f788fb01373b1f81542 | |
parent | 44271b50ac71961be9bf7fb5eb960124c09a0eea (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.c | 11 |
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 ) { |