[FFmpeg-devel] [PATCH] Fix a bug in ff_thread_report_progress in updating progress[field].

Wan-Teh Chang wtc at google.com
Mon Feb 29 23:41:55 CET 2016


This bug was found by Dmitry Vyukov. If two threads may call
ff_thread_report_progress at the same time, progress[field] may
decrease. For example, suppose progress[field] is 10 and two threads
call ff_thread_report_progress to update progress[field] to 11 and
12, respectively. If the second thread acquires progress_mutex first
and updates progress[field] to 12, then the first thread will update
progress[field] to 11, causing progress[field] to decrease.
---
 libavcodec/pthread_frame.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
index b77dd1e..a43e8fe 100644
--- a/libavcodec/pthread_frame.c
+++ b/libavcodec/pthread_frame.c
@@ -482,8 +482,10 @@ void ff_thread_report_progress(ThreadFrame *f, int n, int field)
         av_log(f->owner, AV_LOG_DEBUG, "%p finished %d field %d\n", progress, n, field);
 
     pthread_mutex_lock(&p->progress_mutex);
-    progress[field] = n;
-    pthread_cond_broadcast(&p->progress_cond);
+    if (progress[field] < n) {
+        progress[field] = n;
+        pthread_cond_broadcast(&p->progress_cond);
+    }
     pthread_mutex_unlock(&p->progress_mutex);
 }
 
-- 
2.7.0.rc3.207.g0ac5344



More information about the ffmpeg-devel mailing list