fix(wifi): allouer 0x138 octets + ivars infra pour corriger le #PF CR2:0x1ac dans setGATEWAY_ADDRESS
Breakthroughs: panic wifip2pd -> IO80211Family::setGATEWAY_ADDRESS+0x10f lit [iface+0x128] (ivars IO80211InfraInterface) NULL car objet alloue a 0x128. Modifications: QualcommWifi.cpp (alloc 0x138, bloc ivars infra zero a +0x128); docs Postmortem 29. Validation: build_wifi.sh + kmutil OK; kext copie sur EFI, config.plist laisse a Enabled=false par l'utilisateur.
This commit is contained in:
1 parent
f7d58c049a
commit
057793b847
2 files changed
+17
-2
No files matched your search
@@ -393,12 +393,12 @@ static void installSkywalkCustomVtable(IO80211SkywalkInterface *iface) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static IO80211SkywalkInterface* createSkywalkInterface(void) {
|
static IO80211SkywalkInterface* createSkywalkInterface(void) {
|
||||||
void *mem = _ZN23IO80211SkywalkInterfacenwEm(0x128);
|
void *mem = _ZN23IO80211SkywalkInterfacenwEm(0x138);
|
||||||
if (!mem) {
|
if (!mem) {
|
||||||
IOLog("QualcommWifi: Erreur - operator new(IO80211SkywalkInterface) a echoue !\n");
|
IOLog("QualcommWifi: Erreur - operator new(IO80211SkywalkInterface) a echoue !\n");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
bzero(mem, 0x128);
|
bzero(mem, 0x138);
|
||||||
_ZN23IO80211SkywalkInterfaceC1EPK11OSMetaClass(mem, &_ZN23IO80211SkywalkInterface10gMetaClassE);
|
_ZN23IO80211SkywalkInterfaceC1EPK11OSMetaClass(mem, &_ZN23IO80211SkywalkInterface10gMetaClassE);
|
||||||
|
|
||||||
// Initialisation complète via IO80211SkywalkInterface::init() :
|
// Initialisation complète via IO80211SkywalkInterface::init() :
|
||||||
@@ -411,6 +411,12 @@ static IO80211SkywalkInterface* createSkywalkInterface(void) {
|
|||||||
IOLog("QualcommWifi: IO80211SkywalkInterface::init() reussi (fPropertyTable + lock + ivars alloues) !\n");
|
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);
|
installSkywalkCustomVtable((IO80211SkywalkInterface *)mem);
|
||||||
|
|
||||||
return (IO80211SkywalkInterface *)mem;
|
return (IO80211SkywalkInterface *)mem;
|
||||||
|
|||||||
@@ -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`).
|
- Compilation `Release` sans aucun avertissement ni erreur (`./build_wifi.sh`).
|
||||||
- Liaison du symbole `_ZN20IO80211InfraProtocol10gMetaClassE` validée à 100% via `kmutil libraries`.
|
- Liaison du symbole `_ZN20IO80211InfraProtocol10gMetaClassE` validée à 100% via `kmutil libraries`.
|
||||||
- Déploiement sur `/Volumes/EFI/EFI/OC/Kexts/QualcommWifi.kext` (MD5: `60519498eb033fd46db05b8e19635edf`).
|
- 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.
|
||||||
Reference in new issue
Block a user