Restore disable_configstore, EuiccDisabler and thermal CDEV guards, branding and rebuild/sync helpers; document device roles, laptop migration, and Gitea. Co-authored-by: Cursor <cursoragent@cursor.com>
108 lines
5.1 KiB
Markdown
108 lines
5.1 KiB
Markdown
<!-- Status: historical — Magisk 009 ship resume: docs/009-handoff-20261008.md -->
|
|
|
|
> **Status: historical.** Do not use as execution order. Resume: [`009-handoff-20261008.md`](009-handoff-20261008.md).
|
|
|
|
# FORTIFY POS0: dos errores localizados y corrección candidata
|
|
|
|
Revisión del job `009-bisect-ksync-fortify-pos0`, que terminó con exit=1
|
|
el 2026-09-26 a las 21:54:28 UTC. Se leyó el log del servidor, el fragmento
|
|
aportado y la conversación reciente de Cursor de este proyecto.
|
|
|
|
## Resultado
|
|
|
|
Se reprodujeron los dos símbolos sin resolver en compilaciones aisladas de
|
|
los archivos responsables, usando los argumentos del build fallido y su
|
|
Clang 21. Añadiendo validaciones explícitas de capacidad, desaparecen ambos
|
|
en los objetos tras LTO, **sin stubs y sin desactivar FORTIFY**.
|
|
|
|
[Parche candidato](009-fortify-driver-bounds-candidate.patch).
|
|
Es un cambio local propuesto en esta revisión, no un parche upstream.
|
|
No se ha aplicado al árbol de compilación de Cursor. `git apply --check`
|
|
contra el árbol remoto actual terminó correctamente.
|
|
|
|
## Localización en los objetos reales del build fallido
|
|
|
|
Raíz: `/srv/rom/src/lineage/out/target/product/sunfish/obj/KERNEL_OBJ`.
|
|
|
|
- `techpack/audio/dsp/q6_dlkm.lto.o`: `rtac_remove_voice+0x1d0`,
|
|
relocación `R_AARCH64_CALL26 __read_overflow2`.
|
|
- `drivers/staging/qcacld-3.0/wlan.lto.o`:
|
|
`lim_process_fils_auth_frame2+0xe48`,
|
|
relocación `R_AARCH64_CALL26 __read_overflow`.
|
|
|
|
Importante: modpost etiqueta el error con `.lto.ko`, pero los objetos
|
|
intermedios disponibles son `.lto.o`. Los `.ko` antiguos que quedan en out
|
|
no deben confundirse con módulos del intento fallido.
|
|
|
|
### Audio
|
|
|
|
`techpack/audio/dsp/rtac.c` tiene capacidad para dos entradas de voz.
|
|
`rtac_remove_voice` usa un contador global para recorrer el array y llama a
|
|
`shift_voice_devices`, que copia del elemento `idx+1`. El código de alta
|
|
ya limita el número de entradas, pero ese invariante no basta para eliminar
|
|
la rama de diagnóstico en esta compilación.
|
|
|
|
El candidato valida el contador bajo `rtac_voice_mutex`, antes del recorrido.
|
|
Si supera ARRAY_SIZE(voice), registra el error, libera el mutex y retorna.
|
|
Esto evita aceptar el estado inválido; no altera el recorrido válido ni
|
|
desactiva las comprobaciones de memoria.
|
|
|
|
### Wi-Fi
|
|
|
|
`lim_process_fils.c:1095` recorre `dot11f_ie_rsn.pmkid_count` y compara
|
|
PMKID de 16 bytes. El array declarado en `dot11f.h:6725` es `pmkid[4][16]`.
|
|
El objeto LTO conserva una rama al helper de overflow cuando el contador
|
|
alcanza cinco o más sin haberse encontrado una coincidencia.
|
|
|
|
El parser `dot11f.c:6703` ya rechaza contadores mayores de cuatro. Por tanto,
|
|
esta revisión **no demuestra que exista una entrada explotable ni una lectura
|
|
real fuera de límites**. El compilador no elimina todas las ramas inválidas
|
|
en el consumidor. El candidato comprueba ARRAY_SIZE(pmkid) justo antes del
|
|
bucle y devuelve false ante un contador inválido.
|
|
|
|
## Validación realizada
|
|
|
|
Se trabajó en directorios temporales de rom-dev01, sin cambiar las fuentes
|
|
ni los objetos de salida usados por Cursor:
|
|
|
|
- `/tmp/axp-fortify-probe-bl9zsxpt`: reproducción de ambos archivos y
|
|
prueba Wi-Fi; contiene también una variante preliminar de audio no elegida.
|
|
- `/tmp/axp-fortify-probe-kkcpn4o9`: reproducción y candidato final de audio.
|
|
|
|
Método: leer la orden original de `.rtac.o.cmd` / `.lim_process_fils.o.cmd`,
|
|
conservar sus opciones de Clang/LTO/CFI e includes; cambiar únicamente la
|
|
fuente/output a copias temporales, evitar generar dependencias en out y
|
|
añadir el directorio original para resolver includes locales. Ejecutar
|
|
`ld.lld -m aarch64linux -O2 -r` sobre cada objeto bitcode y consultar
|
|
símbolos sin resolver con llvm-nm.
|
|
|
|
Resultados:
|
|
|
|
```text
|
|
audio baseline: U __read_overflow2
|
|
audio con validación del contador: ningún símbolo overflow sin resolver
|
|
wifi baseline: U __read_overflow
|
|
wifi con validación del contador: ningún símbolo overflow sin resolver
|
|
```
|
|
|
|
**Alcance:** son dos unidades de compilación y su enlace LTO aislado. No se
|
|
ha repetido el enlace completo de q6_dlkm/wlan, modpost global, ROM o boot.
|
|
No se han probado arranque, llamadas de voz, audio ni Wi-Fi en LAB. Tampoco
|
|
se sustituye con esto el harness pendiente de eficacia de los wrappers.
|
|
|
|
## Reanudación para Cursor
|
|
|
|
1. Conservar la evidencia del intento fallido y revisar/aplicar el candidato
|
|
después del reset y del port FORTIFY en la receta reproducible. El script
|
|
ksync resetea las fuentes: una edición manual previa se perdería.
|
|
2. Validar módulos completos/modpost sin `__read_overflow*`, sin nuevos
|
|
stubs, sin `__NO_FORTIFY` en estos controladores y sin apagar LTO/CFI.
|
|
3. Validar el harness de FORTIFY, la config efectiva y el empaquetado antes
|
|
de entregar un nuevo boot. Mantener combo4 como referencia que arranca.
|
|
4. Tras aceptar FORTIFY aislado, probar combo4+FORTIFY y funciones de hardware.
|
|
|
|
La conversación de Cursor proponía mirar los call sites o una exclusión
|
|
puntual con `__NO_FORTIFY`. Ya hay evidencia para intentar primero estas
|
|
validaciones de límites. Las advertencias de versionado de símbolos WLAN
|
|
son un asunto adicional; esta corrección no afirma resolverlas.
|