tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

perfiles: el diagnóstico de makewhatis, corregido con strace

Lo que escribí ayer sobre este fallo tenía dos afirmaciones que la traza
desmiente, y una memoria con un dato falso es peor que no tenerla.

· NO es endianness. Era mi hipótesis y se descarta leyendo el propio chequeo
  del lector (dbm_map.c:82-100): el mágico 0x3a7d0cdb y la versión se validan
  con be32toh ANTES del tamaño, y los dos PASAN. Con la endianness mal fallaría
  el primero, y el mensaje sería «Bad initial magic».

· NO «discrepan escritor y lector». El fichero queda INCOMPLETO: dba_write()
  reserva dos enteros, escribe las tablas y al final hace un seek hacia atrás
  para rellenarlos; medido sobre el resultado, int[2]=0 e int[3]=0 con 552
  bytes de contenido detrás. El lector deduce el tamaño de int[3], de ahí
  «expected 4». Esa queja es el SÍNTOMA del aborto.

· Y no falla ninguna llamada al sistema: todos los write y lseek de la traza
  tienen éxito. El aborto está entre escribir las tablas y rellenar punteros.

⚠ Dos cosas que valen más que el bug concreto:

1. strace NO corre dentro de la jaula (ptrace: Operation not permitted). Hay
   que trazar desde el anfitrión con `raiz`. Eso me costó dos intentos.

2. El mensaje de error de makewhatis es BASURA: su say() termina en
   perror(NULL), que imprime el último errno que hubiera por ahí — en este caso
   el ENOENT de un open("/etc/localtime") de veinte líneas antes. Probado:
   con TZ=UTC el MISMO fallo pasa a decir «No error information» mientras el
   índice sigue sin generarse. Persigui el /etc/localtime varias vueltas antes
   de darme cuenta de que sólo coloreaba el texto. Un programa que reporta
   errno en un fallo que no es de errno manda a investigar el sitio equivocado.

943ea3aac617d65a1f752fe0efde4d6d17210f68 · por Sergio · (hace 22 h) · padre b0085e7cf · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +18 −5

diff --git a/docs/state/targets.toml b/docs/state/targets.toml
index b35cc4d6..5bf96277 100644
--- a/docs/state/targets.toml
+++ b/docs/state/targets.toml
@@ -399,11 +399,24 @@ paquetes = [
   # escritorios grandes y a servidor. `mandoc` —que publica `man`, `apropos` y `whatis`— ya viaja
   # en `base`, así que el lector estaba puesto y sólo faltaba qué leer.
   #
-  # ⚠ Lo que esto NO arregla: `apropos` y `man -k` siguen sin funcionar, y no es culpa de este
-  # paquete. `makewhatis` (de mandoc, en /usr/sbin) muere al escribir el índice, y su lector dice
-  # `dbm_map(mandoc.db): Inconsistent file size 260 (expected 4)` — escritor y lector discrepan
-  # SIENDO EL MISMO BINARIO. Es un defecto del empaquetado de mandoc, con su propia unidad de
-  # trabajo: tocarlo reconstruye `base` y cascadea a todas las imágenes.
+  # ⚠ Lo que esto NO arregla: `apropos`, `whatis` y `man -k` siguen sin funcionar, y no es culpa de
+  # este paquete. `makewhatis` (de mandoc, en /usr/sbin) aborta a mitad de escribir el índice.
+  # Diagnóstico medido con strace desde el anfitrión (dentro de la jaula no se puede: ptrace está
+  # prohibido), y corrige dos cosas que creí antes:
+  #
+  #   · NO es endianness. El mágico (0x3a7d0cdb) y la versión se leen BIEN con be32toh.
+  #   · NO falla ninguna llamada al sistema: todos los write y lseek de la traza tienen éxito.
+  #   · El fichero queda INCOMPLETO: `int[2]` y `int[3]` —los punteros que `dba_write()` rellena
+  #     AL FINAL con un seek hacia atrás— quedan en CERO con 552 bytes de contenido detrás. Por eso
+  #     el lector dice «Inconsistent file size 552 (expected 4)»: calcula el tamaño desde int[3].
+  #     Es un SÍNTOMA del aborto, no un desacuerdo de formato.
+  #   · El mensaje de error es INÚTIL: sale del `perror(NULL)` final de su `say()` y muestra un
+  #     errno RANCIO. Probado: con `TZ=UTC` el mismo fallo pasa a decir «No error information»
+  #     mientras el índice sigue sin generarse. El `/etc/localtime` ausente sólo COLOREA el texto.
+  #
+  # ⇒ El aborto ocurre entre escribir las tablas de páginas/macros y rellenar los punteros, y sale
+  # con 6 (SYSERR). Pinchar la línea exacta pide una sesión de depurador sobre mandoc: es su propia
+  # unidad de trabajo, y además tocar mandoc reconstruye `base` y cascadea a las diez imágenes.
   "man-pages",
   # ── SELLADAS DESDE HACE MESES Y EN NINGUNA IMAGEN (2026-09-12) ───────────────────────────────
   # editor, multiplexor, gestor de ficheros e historial de shell: las cuatro piezas con las que se