diff --git a/QualcommWifi/QualcommWifi.cpp b/QualcommWifi/QualcommWifi.cpp index 1279b9e..a647ce4 100644 --- a/QualcommWifi/QualcommWifi.cpp +++ b/QualcommWifi/QualcommWifi.cpp @@ -393,12 +393,12 @@ static void installSkywalkCustomVtable(IO80211SkywalkInterface *iface) { } static IO80211SkywalkInterface* createSkywalkInterface(void) { - void *mem = _ZN23IO80211SkywalkInterfacenwEm(0x128); + void *mem = _ZN23IO80211SkywalkInterfacenwEm(0x138); if (!mem) { IOLog("QualcommWifi: Erreur - operator new(IO80211SkywalkInterface) a echoue !\n"); return nullptr; } - bzero(mem, 0x128); + bzero(mem, 0x138); _ZN23IO80211SkywalkInterfaceC1EPK11OSMetaClass(mem, &_ZN23IO80211SkywalkInterface10gMetaClassE); // Initialisation complète via IO80211SkywalkInterface::init() : @@ -411,6 +411,12 @@ static IO80211SkywalkInterface* createSkywalkInterface(void) { IOLog("QualcommWifi: IO80211SkywalkInterface::init() reussi (fPropertyTable + lock + ivars alloues) !\n"); } + // IO80211InfraInterface (taille 0x130) lit un pointeur d'ivars infra a +0x128 (ex: setGATEWAY_ADDRESS + // ecrit [ivars+0x1a8/0x1ac]). Fournir un bloc zero pour eviter le #PF CR2:0x1ac (INC-29). + static uint8_t sInfraIvars[0x800]; + bzero(sInfraIvars, sizeof(sInfraIvars)); + *(void **)((uint8_t *)mem + 0x128) = sInfraIvars; + installSkywalkCustomVtable((IO80211SkywalkInterface *)mem); return (IO80211SkywalkInterface *)mem; diff --git a/docs/ISSUES_AND_POSTMORTEMS.md b/docs/ISSUES_AND_POSTMORTEMS.md index 109a88e..f04370f 100644 --- a/docs/ISSUES_AND_POSTMORTEMS.md +++ b/docs/ISSUES_AND_POSTMORTEMS.md @@ -1288,3 +1288,12 @@ Ce document répertorie de manière exhaustive l'ensemble des anomalies, blocage - Compilation `Release` sans aucun avertissement ni erreur (`./build_wifi.sh`). - Liaison du symbole `_ZN20IO80211InfraProtocol10gMetaClassE` validée à 100% via `kmutil libraries`. - Déploiement sur `/Volumes/EFI/EFI/OC/Kexts/QualcommWifi.kext` (MD5: `60519498eb033fd46db05b8e19635edf`). + +--- + +### Postmortem 29 : Kernel panic `#PF CR2:0x1ac` dans `setGATEWAY_ADDRESS` après activation de la VTable infra (INC-28) + +* **Symptôme** : freeze du bureau à l'affichage ; `Kernel-2026-10-20-085148.panic` : page fault `CR2: 0x1ac`, tâche `wifip2pd`, RIP dans `IO80211Family::setGATEWAY_ADDRESS + 0x10f`. +* **Cause racine** : `safeMetaCast` réussissant désormais, les requêtes `apple80211` empruntent le chemin `IO80211InfraInterface` (taille `0x130`) qui lit `[iface + 0x128]` (ivars infra) puis écrit à `+0x1a8/+0x1ac`. Notre objet n'étant alloué qu'à `0x128` octets, ce champ valait NULL. +* **Correctif** : allocation de `0x138` octets et pointeur `+0x128` vers un bloc d'ivars infra zéro de 0x800 octets. +* **Risque résiduel** : d'autres chemins infra (`[ivars+0x120]->+0x28->+0x18->+0x558`, etc.) peuvent encore déréférencer des champs non initialisés ; itérer sur les prochains rapports de panic.