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:

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Kannst du bitte noch die Logfile-Einträge posten vom Start der vorletzten Wiedergabe bis zum Crash?

    <edit>

    Bitte vom Start der *vor*letzten Wiedergabe bis zum Crash.

    </edit>

    25 Jahre VDR! Mach mit beim VDR User Counter!

    Edited once, last by kls (May 15, 2020 at 3:56 PM).

  • 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

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

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

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    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

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    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...

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!