VDR Crash, wenn Abspielen und Stopp einer Aufnahme zu nah bei einander liegen

  • 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:

    Code
    $ ./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:

    Code: Endlosschleife 1
    while :
    do
        svdrpsend HITK STOP
    done
    Code: Endlosschleife 2
    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:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Ich habe noch mal alles neu erzeigt und dafür noch ein paar Log-Warnungen von softhddevice per workaround-Schalter eliminiert - der Aufruf sah jetzt so aus:

    # gdb --args ./vdr -c /etc/vdr/ -v /srv/vdr/video/ -u vdr -l3 "-Psofthddevice -d :0 -vnoop -a pulse -w alsa-driver-broken"

    softhddevice ist aus diesem Git-Repository: https://github.com/ua0lnj/vdr-plugin-softhddevice


    vdr.log.txt

    backtrace.txt

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Damit sieht es so aus:

    vdr.log.txt

    vdr-backtrace.txt

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Mit dem Patch baut der VDR leider nicht, die Fehlermeldung sieht so aus:

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Wenn ich den Patch so

    abändere, sieht es so aus:

    vdr-2.4.1-dbg-double-free-index-04.log.txt

    vdr-2.4.1-dbg-double-free-index-04.backrace.txt

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Momentaner Erkenntnisstand:

    cSVDRPServer::CmdPLAY() ruft cControl::Shutdown() auf, zu einer Zeit, wo sich die Hauptschleife in main() mit

    Interact = Menu ? Menu : cControl::Control();

    das Control geholt hat und im weiteren Verlauf auf das "HITK STOP" reagiert.

    Der cControl::Shutdown() im SVDRP-Thread zerstört das Control, das main() weiterhin verwednet.

    Das hat früher nicht passieren können, da SVDRP-Befehle nicht in einem separaten Thread verarbeitet wurden. Auch jetzt kann es wohl nur in solchen extremen Situationen auftreten, was aber natürlich keine Entschuldigung für ein fehlendes Locking sein kann.

    Ich überlege mir, wie sich das lösen lässt...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!