# Investigación: fallo de autopkgtest `zonetest` (bind9 1:9.16.50-1~deb11u6, rama debian/bullseye)

Fecha: 2026-08-07

## Qué hace el test (`debian/tests/zonetest`)

El script hace `setup` → `run_base` → `run_minimal_any_no` → `teardown`, con `set -e`
(así que cualquier `grep` que no encuentre match aborta el test).

Config relevante en `/etc/bind/named.conf.options`:
```
options {
    directory "/var/cache/bind";
    listen-on port 53 { 127.0.0.1; };
    allow-query { any; };
    recursion yes;
    minimal-responses no;
};
```

Zona `rt.example` (copiada de `bin/tests/system/additional/ns1/rt.db`):
```
$TTL 86400
@ IN SOA ns1 hostmaster ( 2 8H 2H 4W 1D );
    NS ns1
    NS ns1.rt2.example.
ns1 A 10.53.0.1
rt RT 2 www
www AAAA 192::99
www A 192.168.2.99
www X25 100099
```

La parte que probablemente falla:
```
run_minimal_any_no() (
    dig -t ANY www.rt.example @localhost | grep -q 'ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 1'
)
```

## Contexto del test

- Añadido por Paride Legovini (commits `df73ba3b5` y `b138c1de1`, feb 2025).
- Objetivo: verificar `d/p/0033-Limit-the-additional-processing-for-large-RDATA-sets.patch`
  (CVE-2024-11187), porque ese patch modifica el test upstream pero éste no se ejecuta
  ni en build ni como autopkgtest.
- El patch 0033 cambia el test upstream `bin/tests/system/additional/tests.sh` de
  `ADDITIONAL: 2` a `ADDITIONAL: 1` para la consulta `dig -t ANY www.rt.example`.

## Análisis del recuento esperado (ANY www.rt.example, minimal-responses no)

- ANSWER: 3  → www AAAA, www A, www X25.
- AUTHORITY: 2 → NS ns1.rt.example, NS ns1.rt2.example.
- ADDITIONAL:
  - dig envía EDNS por defecto → 1 registro OPT en la sección adicional (cuenta como 1).
  - Sin el patch 0033: además se añade el glue `ns1.rt.example A 10.53.0.1` → ADDITIONAL: 2.
  - Con el patch 0033: en consultas ANY se omite `query_additional()` → sin glue → ADDITIONAL: 1.

### Cómo lo hace el patch (confirmado leyendo el código de este árbol)

- `lib/ns/query.c::query_addns()` (línea ~10805) añade los NS de autoridad vía
  `query_addrrset(..., DNS_SECTION_AUTHORITY)`.
- El patch 0033 modifica `query_addrrset()` (línea ~2223) para envolver
  `query_additional(qctx, rdataset)` en `if (qctx->qtype != dns_rdatatype_any)`.
- Por tanto, para ANY se salta el procesamiento adicional TAMBIÉN de los NS de autoridad
  → se pierde el glue → ADDITIONAL queda en 1 (solo OPT).

**Conclusión lógica: con el patch 0033 aplicado y efectivo, el test DEBE pasar
(ANSWER 3 / AUTHORITY 2 / ADDITIONAL 1).**

## RESULTADO (2026-08-07): la parte funcional del test PASA — hipótesis 1 REFUTADA

Verificación decisiva realizada en esta sesión:

1. **`quilt push -a` aplica TODA la serie (0001..0061 + CVE-2026-1519) sin rechazos.**
2. **0033 aplica LIMPIO, sin fuzz.** El guard quedó bien colocado en
   `lib/ns/query.c:2226` dentro de `query_addrrset()`:
   ```c
   query_addtoname(mname, rdataset);
   query_setorder(qctx, mname, rdataset);
   if (qctx->qtype != dns_rdatatype_any) {
       query_additional(qctx, rdataset);
   }
   ```
   → para ANY se salta `query_additional()` también sobre los NS de autoridad.
3. El patch modifica el test upstream a `ADDITIONAL: 1` (mismo string que el grep
   del autopkgtest). Todo coherente.
4. **Reproducción real con el binario construido** (extraído de
   `bind9_9.16.50-1~deb11u6_amd64.deb`, corriendo con libssl1.1/libxml2/libicu67 de
   bullseye descargadas a `/tmp`, sobre `named.conf` con la zona `rt.example` idéntica
   a la del test, puerto 5354):
   ```
   dig -t ANY www.rt.example @127.0.0.1 -p 5354
   ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 2, ADDITIONAL: 1
   ```
   → **coincide exactamente con el `grep -q` de `run_minimal_any_no` → el test PASA.**

**Conclusión: el patch 0033 está aplicado y es efectivo en el paquete construido.
La lógica DNS del test es correcta. Si el autopkgtest falla, la causa NO es el patch
ni el recuento, sino el ENTORNO del test.**

## Hipótesis restantes (causa ambiental del fallo en CI)

1. **[PRINCIPAL SOSPECHOSO] Carrera de arranque (readiness race).**
   `debian/bind9.named.service` NO tiene `Type=` → `Type=simple`. systemd marca la
   unidad como "active" en cuanto se hace `exec` de `named`, NO cuando named ha
   cargado las zonas y abierto el socket 53. El test hace:
   ```
   systemctl start named
   dig @localhost localdomain.test | grep 'NOERROR'   # run_base, sin espera
   ```
   Si `dig` corre antes de que named esté listo → SERVFAIL/timeout → no hay `NOERROR`
   → con `set -e` el test aborta. Esto explicaría un fallo intermitente/flaky.
   - **Fix recomendado**: añadir en `setup()` un bucle de espera de readiness antes
     de `run_base`, p.ej.:
     ```sh
     for i in $(seq 1 30); do
         dig +short @localhost -p 53 localdomain.test SOA >/dev/null 2>&1 && break
         sleep 1
     done
     ```
     (o usar `rndc status` / esperar el socket). Alternativa upstream: `Type=notify`.

2. **Nombre/alias del servicio: DESCARTADO como bloqueante.**
   `debian/bind9.named.service` instala la unidad `named.service` con
   `Alias=bind9.service`. Por tanto `systemctl {stop,start} bind9` y `... named`
   funcionan ambos vía el alias. (`systemctl stop` sobre unidad inactiva devuelve 0,
   no rompe `set -e`.)

3. **`dig @localhost` y ::1**: named escucha solo en `127.0.0.1` (no en `::1`).
   `localhost` resuelve a `127.0.0.1` y `::1`; dig prueba ambas y cae a IPv4, así que
   funciona. Poco probable como causa, pero anotarlo.

4. **Comportamiento de dig/EDNS distinto** (muy poco probable): dig de
   bind9-dnsutils envía EDNS por defecto → 1 OPT en ADDITIONAL, ya contemplado.

## Cómo reproducir localmente

- En esta máquina hay `dig` (bind9-dnsutils 9.20.24) pero NO `named`/`named-checkzone`
  (bind9 server no instalado). Para reproducir de verdad hace falta el `named` del
  paquete construido desde esta rama.
- Opción rápida de verificación del patch (sin build completo):
  1. `QUILT_PATCHES=debian/patches quilt push -a` y revisar que 0033 aplica sin fuzz.
  2. Inspeccionar `lib/ns/query.c` alrededor de `query_addrrset` para confirmar que
     quedó el `if (qctx->qtype != dns_rdatatype_any)`.
  3. `quilt pop -a` para dejar el árbol limpio.

## Notas

- La rama es `debian/bullseye`, versión objetivo `1:9.16.50-1~deb11u6`.
- Serie de patches: `debian/patches/series` (0001..0061 + CVE-2026-1519_{1,2,3}).
- El paquete instalado en el sistema (9.20.24) NO es el de esta rama; no sirve para
  reproducir el comportamiento de 9.16.
- Archivo untracked observado: `debian/files`.

## TODO al retomar

- [ ] `quilt push -a` y confirmar aplicación limpia de 0033 (rechazado por el usuario
      la primera vez por falta de tiempo; retomar).
- [ ] Confirmar en `lib/ns/query.c` que el guard de ANY quedó bien puesto tras aplicar.
- [ ] Si aplica bien: construir paquete y probar `dig -t ANY www.rt.example` contra el
      named construido para ver el recuento real.
- [ ] Revisar nombre/estado del servicio systemd (bind9 vs named) en el contexto del test.
- [ ] `quilt pop -a` para limpiar.
