segfault von epghttpd beim Speichern von Timern

  • Okay selbes Resultat also an den beiden Instanzen des Python Wrapper liegt es schon mal nicht.


    m.E. wird (sofern es am epghttpd liegt, wovon ich ausgehe) etwas im Speicher überschrieben.

    Komisch ist nur das Valgrind dazu nichts anzeigt.


    Hast du mal versucht es mit FORTIFY oder Stack Protection übersetz? Ggf bringt das Licht ins Dunkel

  • Die beiden Optionen sind Neuland für mich.

    Meinst du mit FORTIFY, gcc mit passenden Optionen/Flags zu versorgen, wie z.B. hier beschrieben und das Gleiche für Stack Protection?

  • ja genau. Definiere dir am besten dieses Macro im Make.config

    Code
    CFLAGS_MEM = -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -D_GLIBCXX_ASSERTIONS \
                 -fstack-clash-protection -fstack-protector-strong \
                 -Wl,-z,nodlopen -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
    CFLAGS_MEM += -fcf-protection=full -Wtrampolines

    und hänge es an die CFLAGS dran:

    Code
    CFLAGS += $(CFLAGS_MEM) -O2

    dann alles neu bauen

    Code
    make clean
    make 

    beim make solltest du dann sehen das die Optionen verwendet werden

    Als Patch:


    das ist kein Fix hilft aber ggf. um dem Problem auf die Spur zu kommen.

  • beim make solltest du dann sehen das die Optionen verwendet werden

    Jup (muss ich eigentlich -fno-stack-protector -O0 aus dem ifdef DEBUG Block auch noch entfernen, weil sich sonst das -O2 und -O0 bzw. die unterschiedlichen stack-protection Optionen beißen?):

    Code
    ...
    Compile main ..
    g++ -c -I/usr/include/mariadb -I/usr/include/mariadb/mysql -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -D_GLIBCXX_ASSERTIONS -fstack-clash-protection -fstack-protector-strong -Wl,-z,nodlopen -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -fcf-protection=full -Wtrampolines -O2 -I/usr/include/python3.12 -I/usr/include/python3.12 -ggdb -fno-stack-protector -O0 -std=c++17 -D__STDC_FORMAT_MACROS -fPIC -Wall -Wreturn-type -Wformat -Wextra -Wparentheses -pedantic -Werror=format-security -Wunused-variable -Wunused-label -Wunused-value -Wunused-function -Wunused-local-typedefs -Wno-unused-parameter -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -DBINDEST='"/usr/local/bin"' -DTARGET='"epgd"' -DLOG_PREFIX='""' -DPLGDIR='"/usr/local/lib/epgd/plugins"' -DUSEUUID -DUSEMD5 -DUSELIBXML -DUSELIBARCHIVE -DUSEJSON -DUSEGUNZIP -DSYSDWDIFO -DUSESYSD -I/usr/include/libxml2  -I/usr/include/libxml2  -I/usr/include/python3.12 -I/usr/include/python3.12 -DGIT_REV='"544018b"' -o main.o main.c
    ...

    aber wie kommt man nun dem Problem besser auf die Spur?

    Sieht immer noch gleich aus für meine Augen:

    Ist übrigens auch immer noch nur der epghttpd inkl. der Änderungen aus https://www.vdr-portal.de/forum/index.php?thread/136271-segfault-von-epghttpd-beim-speichern-von-timern/&pageNo=2

    den ich nach dem Bauen an seinen Bestimmungsort kopiert und dann gestartet habe. Der epgd ist "der Alte", der läuft ja und erstellt auch Timer via Autotimer korrekt, selbst mit "Auto" Option ...

  • Jup (muss ich eigentlich -fno-stack-protector -O0 aus dem ifdef DEBUG Block auch noch entfernen, weil sich sonst das -O2 und -O0 bzw. die unterschiedlichen stack-protection Optionen beißen?):

    ja, sorry hatte ich übersehen:

    aber wie kommt man nun dem Problem besser auf die Spur?

    Sieht immer noch gleich aus für meine Augen:

    in den Fall hat es wie es aussieht nicht geholfen. Diese Einstellungen bewirken das (in bestimmten Situationen) Stack Fehler, Buffer-Overflows etc. erkannt und direkt mir SEGFAULT abgebrochen wird wodurch man die auslösende Stelle besser eingrenzen kann. Hier hat es wohl nicht zugeschlagen. Das ganze war ausgehend von der Vermutung das der Crash in der Python Lib nur ein Folgefehler ist (wovon ich immer noch ausgehe). Hab gerade auch keine Idee mehr wie man dem auf die Schliche kommen könnte.

    Generell läuft meine Implementierung rund um die Python C++ lib ja, zum einen im epgd und zum anderen auch im Test Programm.

  • Hi,

    habe hier das gleiche Problem. Coredump beim Anlegen von timern, die nicht auf 'VDR' gestellt werden.

    Ich poste mal den bt, vielleicht hilft's.

    Christian



    Log dazu:


  • Hi Hopsi,


    hast du auch schonmal versucht, epghttpd so zu bauen, wie horchi hier in Beitrag #23 segfault von epghttpd beim Speichern von Timern vorgeschlagen hat?

    Denk' dabei dann direkt hier dran ;) :

    Jup (muss ich eigentlich -fno-stack-protector -O0 aus dem ifdef DEBUG Block auch noch entfernen, weil sich sonst das -O2 und -O0 bzw. die unterschiedlichen stack-protection Optionen beißen?):

    Viele Grüße,

    Chriss

  • hast du auch schonmal versucht, epghttpd so zu bauen, wie horchi hier in Beitrag #23 segfault von epghttpd beim Speichern von Timern vorgeschlagen hat?

    gerade gemacht:



    Bringt vermutlich auch keine Erleuchtung.

  • Hallo zusammen,
    ich muss mich hier leider auch einklinken, nach dem Upgrade von Ubuntu focal zu noble (yavdr) habe ich das selbe Problem. ;(

    Nachdem ich die Sourcen des Paketes per ppa runtergeladen und versucht habe es manuell zu bauen, sind mir deprecated Warnungen für Curl aufgefallen. Könnten die vielleicht was mit dem Problem zu tun haben?


    Pakete epg:

    Code
    hi  epgd                                 1.3.24+git20240610-2-544018b-0yavdr1~noble+local1
    hi  epghttpd                             1.3.24+git20240610-2-544018b-0yavdr1~noble+local1
    hi  mariadb-plugin-epglv                 1.3.24+git20240610-2-544018b-0yavdr1~noble+local1
    hi  vdr-epg-daemon                       1.3.24+git20240610-2-544018b-0yavdr1~noble+local1
    ii  vdr-plugin-epg2vdr                   1.2.16-0yavdr5~noble                             
    ii  vdr-plugin-epgsearch                 2.4.2+git20240407-10-bd749fe-0yavdr3~noble       

    Pakete python:

    Curl:

    Code
    ii  curl                                 8.5.0-2ubuntu10.1     
    ii  libcurl3t64-gnutls:amd64             8.5.0-2ubuntu10.1     
    ii  libcurl4-openssl-dev:amd64           8.5.0-2ubuntu10.1     
    ii  libcurl4t64:amd64                    8.5.0-2ubuntu10.1     
    ii  libcurlpp-dev:amd64                  0.8.1-5.3build1       
    ii  libcurlpp0t64:amd64                  0.8.1-5.3build1       
    ii  php-curl                             2:8.3+93ubuntu2       
    ii  php8.3-curl                          8.3.6-0ubuntu0.24.04.1

    Gruß
    Frank

    VDR User: 2127
    YaVDR-noble, Case: HFX Classic, Mainboard: ASUS H97M-E, CPU: Intel Celeron CPU G1840T, GPU: GeForce GT 1030, DVB-S: 2x Digital Devices Cine S2 V6, VDR 2.6.9, Kodi 21 (flatpak)
    YaVDR-noble (headless, 24/7), Case: Akasa, Mainboard: NUC D34010WYB, DVB-S: Sundtek SkyTV Ultimate Dual, Miscellaneous: epgd, pihole, VDR 2.6.9

    YaVDR-noble (headless), System: HP 260 G2 DM, DVB-S: Sundtek SkyTV Ultimate Dual, VDR 2.6.9

  • nein mit den Curl Meldungen hat es zu 99,9% nichts zu tun.

    Interessant wäre ob es auf diesem System mit einer älteren libpython z.B. der 3.8 auch passiert, ich weiß nicht wann ich dazu kommen eine entsprechende Testumgebung aufzubauen.


  • Hi horchi ,
    meinen "Server" würde ich ungern kaputt spielen, aber ich versuch mal es mit einem anderen System nachzustellen.
    Auf jeden Fall lief epgd/epghttpd auf diesem Rechner mit Ubuntu focal, das war libpython3.10.

    VDR User: 2127
    YaVDR-noble, Case: HFX Classic, Mainboard: ASUS H97M-E, CPU: Intel Celeron CPU G1840T, GPU: GeForce GT 1030, DVB-S: 2x Digital Devices Cine S2 V6, VDR 2.6.9, Kodi 21 (flatpak)
    YaVDR-noble (headless, 24/7), Case: Akasa, Mainboard: NUC D34010WYB, DVB-S: Sundtek SkyTV Ultimate Dual, Miscellaneous: epgd, pihole, VDR 2.6.9

    YaVDR-noble (headless), System: HP 260 G2 DM, DVB-S: Sundtek SkyTV Ultimate Dual, VDR 2.6.9

  • und nun ist es die 3.12, wäre interessant ab welcher es nicht mehr geht

  • Hi horchi,
    ich habe Yavdr per Ansible in einer VM installiert (noble).
    epgd+httpd+mariadb mit eignen Ansible Rollen.
    Die Python-Pakete für 3.10 und 3.11 von hier: PPA

    Die Pakete für epgd und epghttpd habe ich mit den Sourcen von yavdr gebaut (1.3.24+git20240610).

    3.10 und 3.11 haben funktioniert, bei 3.12 (ubuntu noble) nicht.
    Der BT sieht für mich aus wie die anderen.

    VDR User: 2127
    YaVDR-noble, Case: HFX Classic, Mainboard: ASUS H97M-E, CPU: Intel Celeron CPU G1840T, GPU: GeForce GT 1030, DVB-S: 2x Digital Devices Cine S2 V6, VDR 2.6.9, Kodi 21 (flatpak)
    YaVDR-noble (headless, 24/7), Case: Akasa, Mainboard: NUC D34010WYB, DVB-S: Sundtek SkyTV Ultimate Dual, Miscellaneous: epgd, pihole, VDR 2.6.9

    YaVDR-noble (headless), System: HP 260 G2 DM, DVB-S: Sundtek SkyTV Ultimate Dual, VDR 2.6.9

  • Prima, danke für den Test!
    Dann gilt es herauszufinden was sich zwischen 3.11 und 3.12 geändert hat.

  • Ich habe zwar von Python, C, C++ usw. keine Ahnung, bin beim Suchen aber über diese Seite gestolpert.
    https://docs.python.org/3/c-api/module.html
    Scheinbar wurde mit 3.12 eine neuer Parameter(?) eingeführt der Einfluss auf die Initialisierung von Modulen hat.
    Nur habe ich keine Ahnung ob Single- oder Multi-Phase verwendet werden soll.

    Zitat

    If Py_mod_multiple_interpreters is not specified, the import machinery defaults to Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED.

    Added in version 3.12.

    Vielleicht hilf es ja weiter.

    VDR User: 2127
    YaVDR-noble, Case: HFX Classic, Mainboard: ASUS H97M-E, CPU: Intel Celeron CPU G1840T, GPU: GeForce GT 1030, DVB-S: 2x Digital Devices Cine S2 V6, VDR 2.6.9, Kodi 21 (flatpak)
    YaVDR-noble (headless, 24/7), Case: Akasa, Mainboard: NUC D34010WYB, DVB-S: Sundtek SkyTV Ultimate Dual, Miscellaneous: epgd, pihole, VDR 2.6.9

    YaVDR-noble (headless), System: HP 260 G2 DM, DVB-S: Sundtek SkyTV Ultimate Dual, VDR 2.6.9

  • ja bin auch schon auf MULTIPLE_INTERPRETERS gestoßen ich schaue mal was ich da einbauen muss

  • ich hab mir mal die Hinweise zum Thread handing für die Python Lib angesehen und mal Test weise etwas eingebaut (untested!)

    es compiliert, weiter konnte ich noch nicht testen.

    /EDIT: könnt ja mal berichten wenn ihr es damit testen konntet

    Einmal editiert, zuletzt von horchi ()

  • Mache ich etwas falsch, wenn ich den Patch in eine Datei kopiere und dann im Hauptverzeichnis meiner Quellen ausführe?

    VDR User: 2127
    YaVDR-noble, Case: HFX Classic, Mainboard: ASUS H97M-E, CPU: Intel Celeron CPU G1840T, GPU: GeForce GT 1030, DVB-S: 2x Digital Devices Cine S2 V6, VDR 2.6.9, Kodi 21 (flatpak)
    YaVDR-noble (headless, 24/7), Case: Akasa, Mainboard: NUC D34010WYB, DVB-S: Sundtek SkyTV Ultimate Dual, Miscellaneous: epgd, pihole, VDR 2.6.9

    YaVDR-noble (headless), System: HP 260 G2 DM, DVB-S: Sundtek SkyTV Ultimate Dual, VDR 2.6.9

  • horchi , ich habe die VM zurückgesetzt und Deinen Patch manuell eingefügt.
    Das Kompilieren läuft ohne Fehler durch, aber jetzt startet epghttpd nicht mehr. ;(

    Dump

    VDR User: 2127
    YaVDR-noble, Case: HFX Classic, Mainboard: ASUS H97M-E, CPU: Intel Celeron CPU G1840T, GPU: GeForce GT 1030, DVB-S: 2x Digital Devices Cine S2 V6, VDR 2.6.9, Kodi 21 (flatpak)
    YaVDR-noble (headless, 24/7), Case: Akasa, Mainboard: NUC D34010WYB, DVB-S: Sundtek SkyTV Ultimate Dual, Miscellaneous: epgd, pihole, VDR 2.6.9

    YaVDR-noble (headless), System: HP 260 G2 DM, DVB-S: Sundtek SkyTV Ultimate Dual, VDR 2.6.9

  • versuche es bitte nochmal hiermit.
    Ich bekomme damit mit Python 3.8 einen Deadlock und vermute es ist der hier beschriebene. Menie Hoffnung ist das es damit mit der 3.12 läuft

Jetzt mitmachen!

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