Skip to content

fix(dof): libdof unique (canonique) pour menu ET jeu - corrige le crash sortie de table - #88

Merged
KarotsSugarpie merged 1 commit into
PinCabOs:mainfrom
NLygitadm:feat/dof-libdof-unify
Aug 31, 2026
Merged

KarotsSugarpie merged 1 commit into
PinCabOs:mainfrom
NLygitadm:feat/dof-libdof-unify

Conversation

@NLygitadm

Copy link
Copy Markdown
Contributor

Problème

PinCabOS charge deux libdof.so.0.4.7 différents via deux overlays distincts :

Consommateur Overlay Mécanisme
Menu (vpinfe) overlays/vpinfe-dof-ledwiz-hidraw-stable/ run-vpinfe-systemd.sh → LD_LIBRARY_PATH
Jeu (VPX) overlays/libdof-ledwiz-hidraw-stable/ VPXlauncher.pincabos-original.sh → LD_PRELOAD + LD_LIBRARY_PATH

Rien ne les tient synchronisés. Conséquence concrète : le correctif du
use-after-free au teardown DudesCab (upstream vpinball/libdof#66) n'était
présent que sur l'overlay menu. L'overlay en jeu restait sur un libdof
plus ancien → avec une Dude's Cab + un TeensyStripController, quitter une
table plantait par intermittence.

Diagnostic (3 core dumps, backtraces identiques) :

malloc: double free / invalid pointer
  hid_write()                                   (libhidapi)
  DOF::DudesCab::Device::SendCommand(...)        (libdof)
  DOF::DudesCab::~DudesCab()                      ← destructeur (vide dans #66)
  DOF::OutputControllerList::~OutputControllerList()
  DOF::Cabinet::~Cabinet()
  DOF::DOF::~DOF()
  DOFPluginUnload()                               (plugin-dof.so)

Reproduction mesurée : ~2-3 crashes sur 16 sorties de table avec le libdof
en jeu non corrigé ; 0 sur 16 une fois #66 en place sur ce chemin.

Correctif

Un seul binaire canonique (overlays/libdof-canonical/libdof.so.0.4.7,
libdof #66 officiel — master 0383246, sha256 9e1753f6…), référencé par
symlink depuis les deux overlays :

overlays/vpinfe-dof-ledwiz-hidraw-stable/libdof.so.0.4.7 -> ../libdof-canonical/libdof.so.0.4.7
overlays/libdof-ledwiz-hidraw-stable/libdof.so.0.4.7     -> ../libdof-canonical/libdof.so.0.4.7
  • Mettre à jour libdof = remplacer un seul fichier ; menu et jeu ne peuvent
    plus diverger.
  • Launchers inchangés (ils pointent sur les dossiers overlay, dont le
    libdof.so.0.4.7 est désormais un symlink) → risque minimal.
  • Les autres fichiers des overlays (libdof_python.so, dof.py, libhidapi,
    libusb…) restent propres à chaque consommateur ; seul libdof.so.0.4.7 est
    mutualisé.
  • Au passage : l'overlay menu passe de l'ancien binaire au [PINCABOS-TESTER-REPORT-V3] pipelinetest / pincabos-test #66 officiel, et
    l'overlay jeu du stock au [PINCABOS-TESTER-REPORT-V3] pipelinetest / pincabos-test #66. Le dépôt est allégé (2 binaires de 11 Mo →
    1 canonique + 2 symlinks).

Validation

Sur cab réel (Dude's Cab + Teensy backboard 144×16) : DOF charge #66 au menu et
en jeu ; 0 crash sur de nombreuses sorties de table (auparavant intermittent).

Suite (hors scope de cette PR)

Quand une release libdof ≥ #66 sera empaquetée, remplacer le binaire canonique
par le .so officiel — le build embarqué deviendra inutile. Les copies libdof
bundlées par vpinfe (_internal/third-party/dof) et VPX (plugins/dof)
restent en place mais ne sont pas chargées (overlays prioritaires via
LD_PRELOAD/LD_LIBRARY_PATH).

…sh sortie de table

PinCabOS chargeait DEUX libdof differents via deux overlays :
- overlays/vpinfe-dof-ledwiz-hidraw-stable/  -> vpinfe (menu), LD_LIBRARY_PATH
- overlays/libdof-ledwiz-hidraw-stable/      -> VPX (jeu), LD_PRELOAD

Rien ne les synchronisait. Le correctif du use-after-free DudesCab au teardown
(vpinball/libdof#66) n'avait ete applique qu'a l'overlay MENU ; l'overlay EN JEU
restait sur le libdof stock buggé -> avec une Dude's Cab + un Teensy, la sortie
de table plantait par intermittence (double free / free(): invalid pointer,
backtrace : DudesCab::~DudesCab -> SendCommand -> hid_write).

Fix : un seul binaire canonique (overlays/libdof-canonical/libdof.so.0.4.7,
libdof PinCabOs#66 officiel) reference par SYMLINK depuis les deux overlays. Mettre a
jour libdof = remplacer un seul fichier ; menu et jeu toujours d'accord ; plus de
divergence. Launchers inchanges (ils pointent sur les dossiers overlay).

Au passage : l'overlay menu passe de notre build custom au PinCabOs#66 officiel, et
l'overlay jeu passe du stock au PinCabOs#66. Repo allege (2 binaires 11 Mo -> 1 + 2
symlinks). Valide sur cab reel : 0 crash sur de nombreuses sorties de table.
@KarotsSugarpie
KarotsSugarpie merged commit ed290a8 into PinCabOs:main Aug 31, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants