Hallo,
mir ist beim Herumspielen mit einer VueJS-Komponente fürs yavdr-Webfrontend eine Race-Condition aufgefallen, wenn man eine Aufnahme abspielten lässt und zeitnah jemand die Stop-Taste drückt.
Nachdem ich erst an einen Patch als Ursache gedacht hatte, habe ich es mit der Minimal-Variante (ungepatchter VDR mit einem Ausgabeplugin (noop-Ausgabe, um es einfacher zu machen)) probiert:
$ ./vdr -c /etc/vdr/ -v /srv/vdr/video/ -l3 "-Psofthddevice -vnoop -d :0"
double free or corruption (out)
Abgebrochen (Speicherabzug geschrieben)
Ich kann das meist schon nach einer Hand voll abgespielten Aufnahmen provozieren, wenn ich zwei svdrp-Befehle in zwei parallellen Endlosschleifen (geht z.B. mit tmux bequem über ein SSH-Session) laufen lasse:
while :
do
while read -r rec_id
do
svdrpsend play "$rec_id"; sleep 0.$(( RANDOM % 10 ))
done < <(svdrpsend lstr | grep -Po "(?<=250-)\d+" | shuf)
done
Einen vollständigen Backtrace vom Crash habe ich angehängt: vdr-backtrace.txt
Im Thread 36 sieht es so aus, als ob da Destruktoren mehrfach aufgerufen werden:
Thread 36 (Thread 0x7fffb27fc700 (LWP 2604)):
#0 0x00007ffff78fb18b in raise () at /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff78da859 in abort () at /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff79453ee in () at /lib/x86_64-linux-gnu/libc.so.6
#3 0x00007ffff794d47c in () at /lib/x86_64-linux-gnu/libc.so.6
#4 0x00007ffff794f120 in () at /lib/x86_64-linux-gnu/libc.so.6
#5 0x000055555567fd21 in cIndexFile::~cIndexFile() (this=0x7fff9c070340, __in_chrg=<optimized out>) at recording.c:2614
#6 0x00005555556238c6 in cDvbPlayer::~cDvbPlayer() (this=0x7fff9c06b0a0, __in_chrg=<optimized out>) at dvbplayer.c:342
#7 0x00005555556247aa in cDvbPlayer::~cDvbPlayer() (this=0x7fff9c06b0a0, __in_chrg=<optimized out>) at dvbplayer.c:337
#8 cDvbPlayerControl::Stop() (this=this@entry=0x7fff9c000e90) at dvbplayer.c:1007
#9 0x00005555556523b8 in cReplayControl::Stop() (this=0x7fff9c000e90) at menu.c:5661
#10 0x0000555555652512 in cReplayControl::~cReplayControl() (this=0x7fff9c000e90, __in_chrg=<optimized out>) at menu.c:5614
#11 0x000055555565259d in cReplayControl::~cReplayControl() (this=0x7fff9c000e90, __in_chrg=<optimized out>) at menu.c:5611
#12 0x00005555556741e7 in cControl::Shutdown() () at player.c:105
MutexLock = {mutex = 0x555555795300 <cControl::mutex>, locked = true}
c = <optimized out>
#13 0x00005555556ae55e in cSVDRPServer::CmdPLAY(char const*) (this=0x7fff9c003880, Option=<optimized out>) at svdrp.c:2262
FileName = {_vptr.cString = 0x555555737d38 <vtable for cString+16>, s = 0x7fff9c0724a0 "/srv/vdr/video/local/Covid-19_Spezial_vom_27.4.2020/2020-04-28.15.43.10-0.rec"}
Title = {_vptr.cString = 0x555555737d38 <vtable for cString+16>, s = 0x7fff9c00fb10 "28.04.20 15:43 local~Covid-19 Spezial vom 27.4.2020"}
FramesPerSecond = 50
IsPesRecording = false
Recording = <optimized out>
StateKey = {stateLock = 0x0, write = false, state = 25, timedOut = false}
opt = 0x7fff9c069060 "1"
num = 0x7fff9c069060 "1"
option = 0x7fff9c069061 ""
c = 0 '\000'
#14 0x00005555556b0f92 in cSVDRPServer::Process() (this=0x7fff9c003880) at svdrp.c:2621
c = 10 '\n'
r = <optimized out>
#15 0x00005555556b1220 in cSVDRPServerHandler::ProcessConnections() (this=0x5555559d2330) at svdrp.c:2725
i = 0
#16 0x00005555556b1435 in cSVDRPServerHandler::Action() (this=0x5555559d2330) at svdrp.c:2749
#17 0x00005555556b3765 in cThread::StartThread(cThread*) (Thread=0x5555559d2330) at thread.c:293
#18 0x00007ffff7f12609 in start_thread () at /lib/x86_64-linux-gnu/libpthread.so.0
#19 0x00007ffff79d7103 in clone () at /lib/x86_64-linux-gnu/libc.so.6
Alles anzeigen