diff --git a/QualcommWifi/QualcommWifi.cpp b/QualcommWifi/QualcommWifi.cpp index a647ce4..6021169 100644 --- a/QualcommWifi/QualcommWifi.cpp +++ b/QualcommWifi/QualcommWifi.cpp @@ -413,8 +413,10 @@ static IO80211SkywalkInterface* createSkywalkInterface(void) { // 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]; + // Taille >= 0x2978 + 0x12d8 : getHW_SUPPORTED_CHANNELS copie 0x12d8 octets depuis [ivars+0x2978]. + static uint8_t sInfraIvars[0x4000]; bzero(sInfraIvars, sizeof(sInfraIvars)); + qualcomm_getSUPPORTED_CHANNELS(nullptr, (apple80211_sup_channel_data *)(sInfraIvars + 0x2978)); *(void **)((uint8_t *)mem + 0x128) = sInfraIvars; installSkywalkCustomVtable((IO80211SkywalkInterface *)mem); diff --git a/docs/ISSUES_AND_POSTMORTEMS.md b/docs/ISSUES_AND_POSTMORTEMS.md index f04370f..ed202c0 100644 --- a/docs/ISSUES_AND_POSTMORTEMS.md +++ b/docs/ISSUES_AND_POSTMORTEMS.md @@ -1297,3 +1297,4 @@ Ce document répertorie de manière exhaustive l'ensemble des anomalies, blocage * **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. +* **Audit statique complémentaire (INC-29)** : 66 handlers de `IO80211Family` castent vers `IO80211InfraInterface`. Seuls `setGATEWAY_ADDRESS` (écrit `[ivars+0x1a8/0x1ac]`) et `getHW_SUPPORTED_CHANNELS` (copie `0x12d8` octets depuis `[ivars+0x2978]`) lisent `[iface+0x128]` ; les autres passent par `[iface+0x120]` (ivars Skywalk valides) ou testent NULL. Le bloc d'ivars infra est donc porté à `0x4000` octets et `+0x2978` pré-rempli avec la liste de canaux.