Files
AXP-Resurection/docs/009-fortify-pos0-link-failure-20260927.md
sunfish-adminandCursor 2d145c2878 009: Polish bacon fixes, OTA host scripts, and migration docs.
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>
2026-10-16 21:06:45 +02:00

5.1 KiB

Status: historical. Do not use as execution order. Resume: 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. 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:

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.