Opened 8 months ago

#10567 new defect

Data race in mpegvideo.c and mpeg4video.h

Reported by: hcantunc Owned by:
Priority: normal Component: ffmpeg
Version: git-master Keywords: data race
Cc: hcantunc Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Summary of the bug:
I'm developing a new bug detector on top of TSan, which found a data race in mpeg4video.h and mpegvideo.c. I confirmed that this issue is also reproducible with the original TSan. Below please find the detailed report.

How to reproduce:

% ./ffmpeg -y -threads 4 -i input.mp4 output.avi
ffmpeg version 6.0
built on Ubuntu 20.04 with TSan enabled.

There also seems a number of other races on the same variable dc_val in different lines. Below, I have also put the other line number pairs where a race was found.

WARNING: ThreadSanitizer: data race (pid=1093048)

  Read of size 2 at 0x7b8c00006b64 by thread T19 (mutexes: write M0):
    #0 ff_mpeg4_pred_dc ~/ffmpeg/libavcodec/mpeg4video.h:73:9 (ffmpeg+0x161a1f6)
    #1 ff_mpeg4_encode_mb ~/ffmpeg/libavcodec/mpeg4videoenc.c:806:26 (ffmpeg+0x1618a8f)
    #2 encode_mb_internal ~/ffmpeg/libavcodec/mpegvideo_enc.c:2462:13 (ffmpeg+0x169c929)
    #3 encode_mb ~/ffmpeg/libavcodec/mpegvideo_enc.c:2504:9 (ffmpeg+0x169c929)
    #4 encode_thread ~/ffmpeg/libavcodec/mpegvideo_enc.c:3431:17 (ffmpeg+0x169c929)
    #5 worker_func ~/ffmpeg/libavcodec/pthread_slice.c:76:21 (ffmpeg+0x17d5fe4)
    #6 run_jobs ~/ffmpeg/libavutil/slicethread.c:65:9 (ffmpeg+0x290fb42)
    #7 thread_worker ~/ffmpeg/libavutil/slicethread.c:89:13 (ffmpeg+0x290f14d)

  Previous write of size 2 at 0x7b8c00006b64 by thread T18 (mutexes: write M1):
    #0 ff_clean_intra_table_entries ~/ffmpeg/libavcodec/mpegvideo.c:840:22 (ffmpeg+0x165a72f)
    #1 mpv_reconstruct_mb_internal ~/ffmpeg/libavcodec/mpv_reconstruct_mb_template.c:68:17 (ffmpeg+0x16b5772)
    #2 mpv_reconstruct_mb ~/ffmpeg/libavcodec/mpegvideo_enc.c:1047:5 (ffmpeg+0x16b5772)
    #3 encode_thread ~/ffmpeg/libavcodec/mpegvideo_enc.c:3440:17 (ffmpeg+0x16a53f5)
    #4 worker_func ~/ffmpeg/libavcodec/pthread_slice.c:76:21 (ffmpeg+0x17d5fe4)
    #5 run_jobs ~/ffmpeg/libavutil/slicethread.c:65:9 (ffmpeg+0x290fb42)
    #6 thread_worker ~/ffmpeg/libavutil/slicethread.c:89:13 (ffmpeg+0x290f14d)

  Location is heap block of size 6870 at 0x7b8c00005400 allocated by main thread:
    #0 posix_memalign ~/tsan/rtl/tsan_interceptors_posix.cpp:884:3 (ffmpeg+0x182377)
    #1 av_malloc ~/ffmpeg/libavutil/mem.c:105:9 (ffmpeg+0x28b0cb9)
    #2 av_mallocz ~/ffmpeg/libavutil/mem.c:256:17 (ffmpeg+0x28b1325)
    #3 av_calloc ~/ffmpeg/libavutil/mem.c:267:12 (ffmpeg+0x28b13c1)
    #4 ff_mpv_init_context_frame ~/ffmpeg/libavcodec/mpegvideo.c:611:14 (ffmpeg+0x1658745)
    #5 ff_mpv_common_init ~/ffmpeg/libavcodec/mpegvideo.c:727:16 (ffmpeg+0x1659097)
    #6 ff_mpv_encode_init ~/ffmpeg/libavcodec/mpegvideo_enc.c:803:16 (ffmpeg+0x167cfa0)
    #7 encode_init ~/ffmpeg/libavcodec/mpeg4videoenc.c:1291:16 (ffmpeg+0x161ee0c)
    #8 avcodec_open2 ~/ffmpeg/libavcodec/avcodec.c:322:19 (ffmpeg+0xf54382)
    #9 init_output_stream ~/ffmpeg/fftools/ffmpeg.c:3233:20 (ffmpeg+0x26e607)
    #10 init_output_stream_wrapper ~/ffmpeg/fftools/ffmpeg.c:739:11 (ffmpeg+0x26deb0)
    #11 do_video_out ~/ffmpeg/fftools/ffmpeg.c:1265:5 (ffmpeg+0x27621c)
    #12 reap_filters ~/ffmpeg/fftools/ffmpeg.c:1426:17 (ffmpeg+0x274461)
    #13 transcode_step ~/ffmpeg/fftools/ffmpeg.c:4002:12 (ffmpeg+0x269fb0)
    #14 transcode ~/ffmpeg/fftools/ffmpeg.c:4039:15 (ffmpeg+0x267725)
    #15 main ~/ffmpeg/fftools/ffmpeg.c:4177:9 (ffmpeg+0x266be9)

  Mutex M0 (0x7b5c00003338) created at:
    #0 pthread_mutex_init ~/tsan/rtl/tsan_interceptors_posix.cpp:1341:3 (ffmpeg+0x1a6782)
    #1 strict_pthread_mutex_init ~/ffmpeg/libavutil/thread.h:78:9 (ffmpeg+0x290ee1c)
    #2 avpriv_slicethread_create ~/ffmpeg/libavutil/slicethread.c:146:9 (ffmpeg+0x290eae2)
    #3 ff_slice_thread_init ~/ffmpeg/libavcodec/pthread_slice.c:164:31 (ffmpeg+0x17d5cce)
    #4 ff_thread_init ~/ffmpeg/libavcodec/pthread.c:76:16 (ffmpeg+0x17cee38)
    #5 avcodec_open2 ~/ffmpeg/libavcodec/avcodec.c:309:15 (ffmpeg+0xf5428c)
    #6 init_output_stream ~/ffmpeg/fftools/ffmpeg.c:3233:20 (ffmpeg+0x26e607)
    #7 init_output_stream_wrapper ~/ffmpeg/fftools/ffmpeg.c:739:11 (ffmpeg+0x26deb0)
    #8 do_video_out ~/ffmpeg/fftools/ffmpeg.c:1265:5 (ffmpeg+0x27621c)
    #9 reap_filters ~/ffmpeg/fftools/ffmpeg.c:1426:17 (ffmpeg+0x274461)
    #10 transcode_step ~/ffmpeg/fftools/ffmpeg.c:4002:12 (ffmpeg+0x269fb0)
    #11 transcode ~/ffmpeg/fftools/ffmpeg.c:4039:15 (ffmpeg+0x267725)
    #12 main ~/ffmpeg/fftools/ffmpeg.c:4177:9 (ffmpeg+0x266be9)

  Mutex M1 (0x7b5c000032c8) created at:
    #0 pthread_mutex_init ~/tsan/rtl/tsan_interceptors_posix.cpp:1341:3 (ffmpeg+0x1a6782)
    #1 strict_pthread_mutex_init ~/ffmpeg/libavutil/thread.h:78:9 (ffmpeg+0x290ee1c)
    #2 avpriv_slicethread_create ~/ffmpeg/libavutil/slicethread.c:146:9 (ffmpeg+0x290eae2)
    #3 ff_slice_thread_init ~/ffmpeg/libavcodec/pthread_slice.c:164:31 (ffmpeg+0x17d5cce)
    #4 ff_thread_init ~/ffmpeg/libavcodec/pthread.c:76:16 (ffmpeg+0x17cee38)
    #5 avcodec_open2 ~/ffmpeg/libavcodec/avcodec.c:309:15 (ffmpeg+0xf5428c)
    #6 init_output_stream ~/ffmpeg/fftools/ffmpeg.c:3233:20 (ffmpeg+0x26e607)
    #7 init_output_stream_wrapper ~/ffmpeg/fftools/ffmpeg.c:739:11 (ffmpeg+0x26deb0)
    #8 do_video_out ~/ffmpeg/fftools/ffmpeg.c:1265:5 (ffmpeg+0x27621c)
    #9 reap_filters ~/ffmpeg/fftools/ffmpeg.c:1426:17 (ffmpeg+0x274461)
    #10 transcode_step ~/ffmpeg/fftools/ffmpeg.c:4002:12 (ffmpeg+0x269fb0)
    #11 transcode ~/ffmpeg/fftools/ffmpeg.c:4039:15 (ffmpeg+0x267725)
    #12 main ~/ffmpeg/fftools/ffmpeg.c:4177:9 (ffmpeg+0x266be9)

  Thread T19 (tid=1093069, running) created by main thread at:
    #0 pthread_create ~/tsan/rtl/tsan_interceptors_posix.cpp:1048:3 (ffmpeg+0x16b8d6)
    #1 avpriv_slicethread_create ~/ffmpeg/libavutil/slicethread.c:151:19 (ffmpeg+0x290eb3e)
    #2 ff_slice_thread_init ~/ffmpeg/libavcodec/pthread_slice.c:164:31 (ffmpeg+0x17d5cce)
    #3 ff_thread_init ~/ffmpeg/libavcodec/pthread.c:76:16 (ffmpeg+0x17cee38)
    #4 avcodec_open2 ~/ffmpeg/libavcodec/avcodec.c:309:15 (ffmpeg+0xf5428c)
    #5 init_output_stream ~/ffmpeg/fftools/ffmpeg.c:3233:20 (ffmpeg+0x26e607)
    #6 init_output_stream_wrapper ~/ffmpeg/fftools/ffmpeg.c:739:11 (ffmpeg+0x26deb0)
    #7 do_video_out ~/ffmpeg/fftools/ffmpeg.c:1265:5 (ffmpeg+0x27621c)
    #8 reap_filters ~/ffmpeg/fftools/ffmpeg.c:1426:17 (ffmpeg+0x274461)
    #9 transcode_step ~/ffmpeg/fftools/ffmpeg.c:4002:12 (ffmpeg+0x269fb0)
    #10 transcode ~/ffmpeg/fftools/ffmpeg.c:4039:15 (ffmpeg+0x267725)
    #11 main ~/ffmpeg/fftools/ffmpeg.c:4177:9 (ffmpeg+0x266be9)

  Thread T18 (tid=1093068, running) created by main thread at:
    #0 pthread_create ~/tsan/rtl/tsan_interceptors_posix.cpp:1048:3 (ffmpeg+0x16b8d6)
    #1 avpriv_slicethread_create ~/ffmpeg/libavutil/slicethread.c:151:19 (ffmpeg+0x290eb3e)
    #2 ff_slice_thread_init ~/ffmpeg/libavcodec/pthread_slice.c:164:31 (ffmpeg+0x17d5cce)
    #3 ff_thread_init ~/ffmpeg/libavcodec/pthread.c:76:16 (ffmpeg+0x17cee38)
    #4 avcodec_open2 ~/ffmpeg/libavcodec/avcodec.c:309:15 (ffmpeg+0xf5428c)
    #5 init_output_stream ~/ffmpeg/fftools/ffmpeg.c:3233:20 (ffmpeg+0x26e607)
    #6 init_output_stream_wrapper ~/ffmpeg/fftools/ffmpeg.c:739:11 (ffmpeg+0x26deb0)
    #7 do_video_out ~/ffmpeg/fftools/ffmpeg.c:1265:5 (ffmpeg+0x27621c)
    #8 reap_filters ~/ffmpeg/fftools/ffmpeg.c:1426:17 (ffmpeg+0x274461)
    #9 transcode_step ~/ffmpeg/fftools/ffmpeg.c:4002:12 (ffmpeg+0x269fb0)
    #10 transcode ~/ffmpeg/fftools/ffmpeg.c:4039:15 (ffmpeg+0x267725)
    #11 main ~/ffmpeg/fftools/ffmpeg.c:4177:9 (ffmpeg+0x266be9)

SUMMARY: ThreadSanitizer: data race ~/ffmpeg/libavcodec/mpeg4video.h:73:9 in ff_mpeg4_pred_dc


Other races on the variable dc_val:

  • mpeg4video.h:124, mpeg4video.h:73
  • mpeg4video.h:124, mpeg4video.h:74
  • mpegvideo.c:826, mpeg4video.h:74
  • mpegvideo.c:839, mpeg4video.h:73

Change History (0)

Note: See TracTickets for help on using tickets.