Record NODEINFO parsing fix and sanitizer validation

This commit is contained in:
evgeny committed 2026-10-24 13:21:42 +02:00
1 parent 99dd48480f
commit 902ffa05b4
1 file changed
+14 -11
+14 -11
View File
@@ -4,17 +4,20 @@
## Текущие задачи
[ ] **Routing: согласовать обход секции подсетей в topo_node_deserialize с wire-размером**.
24.10.2026, продолжение аудита: при flags=0, local_v4_subnets=1, hop_count=1 размер равен header+8,
но ветка без TOPO_FLAG_SEND_SUBNETS сдвигает dp ещё на 5 байт. Копирование hop-list читает за len.
Воспроизведение на собранной библиотеке: заданный hop 11 11 11 11 11 11 11 11 превращается в
11 11 11 aa aa aa aa aa; пять aa находятся после переданной длины. deserialize возвращает 0.
Причина: topo_node_dyn_size не включает подсети без флага, а deserialize всё равно пропускает их.
Нужно согласовать serializer/размер/parser: при снятом флаге секции на wire нет; счётчики должны
быть нулевыми либо явно игнорироваться без сдвига. При установленном флаге обход секции не должен
зависеть от наличия out_subnets. Добавить регрессии границ буфера и обоих режимов out_subnets.
Дальнейший аудит остановлен по AGENTS.md; parser не менялся.
Воспроизведение: /tmp/routing-audit-deserialize-repro.c; лог: /tmp/routing-audit-deserialize-repro.log.
[+] **Routing: согласовать обход секции подсетей в topo_node_deserialize с wire-размером**.
24.10.2026: ручная упаковка/разбор доработаны без lib/serialize. Без TOPO_FLAG_SEND_SUBNETS
счётчики подсетей равны 0; противоречащий заголовок отклоняется до выделения объектов.
Все присутствующие секции проверяются независимо от out_*; hop-list читается после подсетей.
Выходы независимы, выдаются атомарно; пустые секции/ошибки возвращают NULL/0. Частичные списки,
имя, подсети и hops освобождаются при любом отказе. Уточнены .h и документы формата.
Новая регрессия воспроизводит приём некорректного пакета до исправления; после — PASS:
64 сочетания флагов/выходов, все усечения и лишний хвост, IPv4/IPv6-префиксы, 18 отказов памяти.
BGP-проверка сохраняет прежние запись и маршрут при некорректном NODEINFO; REALITY fixture
передаёт контекст ядра и освобождает результат. Полный check.sh: 185/185 PASS, proxy 9/9,
burst 1/1, load 8/8 (134217728 байт), 163с. Лог: /tmp/node-wire-full-check-final.log.
Шесть целевых наборов ASAN/UBSan/LSan (wire, snapshot, group_exchange, bgp_paths, NCD, REALITY)
проходят с detect_leaks=1. Зависимости пересобраны с sanitizer-флагами в отдельной копии /tmp;
штатный override флагов Opus снят только в этой копии. Лог: /tmp/node-wire-asan-results.log.
[+] **Routing: запретить пересекающиеся IPv4-подсети при вставке route_lib**.
24.10.2026: по решению пользователя сохранён запрет пересечений. Весь входной набор проверяется