# 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.