Commits on Source (4)
-
decoder_Init() is setting up p_owner->dec whereas LoadDecoder will read and write p_owner. To modify LoadDecoder, we want to ensure that the fifo is locked, but we cannot lock the fifo for LoadDecoder. Extracting the decoder_Init() ensure we can lock correctly afterwards. Co-authored-by:
Steve Lhomme <robux4@ycbcr.xyz>
8daa3f65 -
We cannot read or write the decoder object without being under the fifo lock, so ensure we locked first. It fixes some thread sanitizer issues between decoder_Init() and vlc_input_decoder_Flush(). WARNING: ThreadSanitizer: data race (pid=876901) Read of size 8 at 0x7b7000010028 by thread T25: #0 vlc_input_decoder_Flush ../../src/input/decoder.c:2317 (libvlccore.so.9+0x69d7a) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #1 EsOutDestroyDecoder ../../src/input/es_out.c:2360 (libvlccore.so.9+0x716cf) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #2 EsOutUnselectEs ../../src/input/es_out.c:2534 (libvlccore.so.9+0x7a1bd) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #3 EsOutVaPrivControlLocked ../../src/input/es_out.c:3733 (libvlccore.so.9+0x75832) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #4 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783ad) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #5 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a06) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #6 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a06) #7 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81b78) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #8 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840be) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #9 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840be) #10 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86f7c) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #11 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86f7c) #12 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x91ba9) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #13 End ../../src/input/input.c:1425 (libvlccore.so.9+0x91ba9) #14 Run ../../src/input/input.c:431 (libvlccore.so.9+0x920d4) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) Previous write of size 8 at 0x7b7000010028 by thread T27: #0 decoder_Init ../../src/input/decoder_helpers.c:50 (libvlccore.so.9+0x6c1ce) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #1 LoadDecoder ../../src/input/decoder.c:370 (libvlccore.so.9+0x672ae) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #2 DecoderThread_Reload ../../src/input/decoder.c:431 (libvlccore.so.9+0x67593) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #3 DecoderThread_ProcessInput ../../src/input/decoder.c:1595 (libvlccore.so.9+0x687f9) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #4 DecoderThread_DecodeBlock ../../src/input/decoder.c:1562 (libvlccore.so.9+0x6865b) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #5 DecoderThread_ProcessInput ../../src/input/decoder.c:1667 (libvlccore.so.9+0x6895e) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d) #6 DecoderThread ../../src/input/decoder.c:1795 (libvlccore.so.9+0x6a487) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
f19e27a4 -
Reloading the decoder was never protected against races because processing an input frame was done unprotected. The rationale behind was that we cannot lock the vlc_input_decoder_t FIFO when calling any function from the decoder_t object implementation. This commit is broadening the locks everywhere but when: - the decoder is created (LoadDecoder) - the decoder is destroyed (decoder_Clean) - the decode callback is called on the decoder (decoder_t::pf_decode) It fixes race conditions on the outputs (audio, video) and the usage of the dec_fmt_in structure. WARNING: ThreadSanitizer: data race (pid=2404868) Write of size 8 at 0x7b7000010028 by thread T27: #0 decoder_Init ../../src/input/decoder_helpers.c:50 (libvlccore.so.9+0x6c1fe) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #1 DecoderThread_Reload ../../src/input/decoder.c:428 (libvlccore.so.9+0x67581) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #2 DecoderThread_ProcessInput ../../src/input/decoder.c:1593 (libvlccore.so.9+0x68829) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #3 DecoderThread_DecodeBlock ../../src/input/decoder.c:1560 (libvlccore.so.9+0x6868b) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #4 DecoderThread_ProcessInput ../../src/input/decoder.c:1665 (libvlccore.so.9+0x6898e) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #5 DecoderThread ../../src/input/decoder.c:1793 (libvlccore.so.9+0x6a4b7) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) Previous read of size 8 at 0x7b7000010028 by thread T25: #0 vlc_input_decoder_Flush ../../src/input/decoder.c:2318 (libvlccore.so.9+0x69dc2) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #1 EsOutDestroyDecoder ../../src/input/es_out.c:2360 (libvlccore.so.9+0x716ff) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #2 EsOutUnselectEs ../../src/input/es_out.c:2534 (libvlccore.so.9+0x7a1ed) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #3 EsOutVaPrivControlLocked ../../src/input/es_out.c:3733 (libvlccore.so.9+0x75862) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #4 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783dd) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #5 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a36) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #6 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a36) #7 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81ba8) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #8 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840ee) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #9 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840ee) #10 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86fac) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #11 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86fac) #12 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x91bd9) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #13 End ../../src/input/input.c:1425 (libvlccore.so.9+0x91bd9) #14 Run ../../src/input/input.c:431 (libvlccore.so.9+0x92104) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) Location is heap block of size 2008 at 0x7b7000010000 allocated by thread T25: #0 calloc /usr/src/debug/gcc/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:701 (libtsan.so.2+0x43413) (BuildId: 7e8fcb9ed0a63b98f2293e37c92ac955413efd9e) #1 vlc_custom_create ../../src/misc/objects.c:97 (libvlccore.so.9+0x10e4c3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #2 CreateDecoder ../../src/input/decoder.c:1873 (libvlccore.so.9+0x676cf) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #3 decoder_New ../../src/input/decoder.c:2132 (libvlccore.so.9+0x676cf) #4 vlc_input_decoder_New ../../src/input/decoder.c:2191 (libvlccore.so.9+0x698a0) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #5 EsOutCreateDecoder ../../src/input/es_out.c:2302 (libvlccore.so.9+0x786da) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #6 EsOutSelectEs ../../src/input/es_out.c:2444 (libvlccore.so.9+0x78ec3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #7 EsOutSelect ../../src/input/es_out.c:2733 (libvlccore.so.9+0x7935a) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #8 EsOutVaPrivControlLocked ../../src/input/es_out.c:3737 (libvlccore.so.9+0x7713c) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #9 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783dd) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #10 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a36) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #11 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a36) #12 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81ba8) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #13 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840ee) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #14 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840ee) #15 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86fac) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #16 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86fac) #17 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x8d118) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #18 InitPrograms ../../src/input/input.c:1262 (libvlccore.so.9+0x8d118) #19 Init ../../src/input/input.c:1343 (libvlccore.so.9+0x8d118) #20 Run ../../src/input/input.c:426 (libvlccore.so.9+0x92064) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) Thread T27 'vlc-dec-video' (tid=2404917, running) created by thread T25 at: #0 pthread_create /usr/src/debug/gcc/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:1036 (libtsan.so.2+0x44219) (BuildId: 7e8fcb9ed0a63b98f2293e37c92ac955413efd9e) #1 vlc_clone_attr ../../src/posix/thread.c:180 (libvlccore.so.9+0x11f789) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #2 vlc_clone ../../src/posix/thread.c:191 (libvlccore.so.9+0x11f789) #3 decoder_New ../../src/input/decoder.c:2169 (libvlccore.so.9+0x67eea) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #4 vlc_input_decoder_New ../../src/input/decoder.c:2191 (libvlccore.so.9+0x698a0) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #5 EsOutCreateDecoder ../../src/input/es_out.c:2302 (libvlccore.so.9+0x786da) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #6 EsOutSelectEs ../../src/input/es_out.c:2444 (libvlccore.so.9+0x78ec3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #7 EsOutSelect ../../src/input/es_out.c:2733 (libvlccore.so.9+0x7935a) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #8 EsOutVaPrivControlLocked ../../src/input/es_out.c:3737 (libvlccore.so.9+0x7713c) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #9 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783dd) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #10 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a36) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #11 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a36) #12 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81ba8) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #13 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840ee) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #14 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840ee) #15 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86fac) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #16 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86fac) #17 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x8d118) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #18 InitPrograms ../../src/input/input.c:1262 (libvlccore.so.9+0x8d118) #19 Init ../../src/input/input.c:1343 (libvlccore.so.9+0x8d118) #20 Run ../../src/input/input.c:426 (libvlccore.so.9+0x92064) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) Thread T25 'vlc-input' (tid=2404915, running) created by main thread at: #0 pthread_create /usr/src/debug/gcc/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:1036 (libtsan.so.2+0x44219) (BuildId: 7e8fcb9ed0a63b98f2293e37c92ac955413efd9e) #1 vlc_clone_attr ../../src/posix/thread.c:180 (libvlccore.so.9+0x11f789) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #2 vlc_clone ../../src/posix/thread.c:191 (libvlccore.so.9+0x11f789) #3 input_Start ../../src/input/input.c:131 (libvlccore.so.9+0x8a4a3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #4 vlc_player_input_Start ../../src/player/input.c:96 (libvlccore.so.9+0x9e4a2) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #5 vlc_player_Start ../../src/player/player.c:1177 (libvlccore.so.9+0x998f0) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #6 play_scenario ../../test/src/input/decoder/input_decoder.c:260 (test_src_input_decoder+0x3295) (BuildId: 37860f3bd060e79331c2c7c0168bd76a7e275f6e) #7 OpenIntf ../../test/src/input/decoder/input_decoder.c:289 (test_src_input_decoder+0x3295) #8 generic_start ../../src/modules/modules.c:280 (libvlccore.so.9+0x3fca9) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #9 vlc_module_load ../../src/modules/modules.c:248 (libvlccore.so.9+0x40992) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #10 module_need ../../src/modules/modules.c:291 (libvlccore.so.9+0x40c39) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #11 intf_Create ../../src/interface/interface.c:173 (libvlccore.so.9+0x49a3a) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #12 libvlc_InternalAddIntf ../../src/interface/interface.c:268 (libvlccore.so.9+0x49e71) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d) #13 libvlc_add_intf ../../lib/playlist.c:41 (libvlc.so.12+0xd678) (BuildId: 9df6c3ada3ed68d6ad4df6e6a25454ae0f0d2376) #14 main ../../test/src/input/decoder/input_decoder.c:351 (test_src_input_decoder+0x2584) (BuildId: 37860f3bd060e79331c2c7c0168bd76a7e275f6e) SUMMARY: ThreadSanitizer: data race ../../src/input/decoder_helpers.c:50 in decoder_Init ================== Fixes #27582
6369ea50 -
p_dec is only used once, and p_dec->fmt_int references dec_fmt_in so inline the p_owner->dec and dec->fmt_in in the call to avoid the intermediate variable.
55ad5969