From dd81f7a665857c6e83f17ba0e76bbcf7ef521609 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sun, 25 Oct 2026 22:44:55 +0100 Subject: [PATCH] Record packet dump fix and FreeBSD socket monitor finding --- doc/tasks.md | 34 +++++++++++++++++----------- src/transport_layer/socket_monitor.h | 4 +++- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/doc/tasks.md b/doc/tasks.md index 7afd4d7e..798c61f7 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,19 +4,27 @@ ## Текущие задачи -[ ] **packet_dump: ограничить чтение входного IPv4-пакета** — найдено статической сверкой 25.10.2026. - В `src/transport_layer/packet_dump.c` все три ветки hex-дампа читают 32 байта после IHL, - не учитывая остаток len. Это затрагивает также распознанные TCP/UDP/ICMP-пакеты; - ограничение snprintf относится только к выходу и не защищает входные чтения. - Вызовы: `tun_if.c` (категория tun/debug), `routing_layer/routing.c` (traffic/debug). - Документ ошибочно представлял выход за границу как допустимый компромисс для неизвестных протоколов; - это описание исправлено, предупреждение добавлено в .h. Код пока не менялся. - Предлагаемое исправление: единый ограниченный hex-цикл по доступным байтам, проверка NULL, - IHL >=20 и IPv4 total length; адреса читать побайтно без невыравненных uint32_t-приведений. - При разборе учитывать смещение IP-фрагмента, чтобы не выдавать его данные за транспортный заголовок. - Проверить короткие/усечённые пакеты и корректные TCP/UDP/ICMP/прочие протоколы под ASAN/UBSan; - затем согласовать окончательный контракт .h/документа. Runtime-воспроизведение не выполнялось. - Аудит остановлен по AGENTS.md:10; packet_dump.h и packet_dump_doc.md проверены частично. +[ ] **socket_monitor: исправить FreeBSD-разбор уведомлений адреса** — найдено статической сверкой 25.10.2026. + В `src/transport_layer/socket_monitor.c:329` обработчик RTM_NEWADDR/RTM_DELADDR вызывает + `bsd_parse_rtm(..., NULL, 0, ...)`, а разборщик на строке272 безусловно выполняет `gw[0]='\0'`. + Получение такого уведомления ведёт к записи по NULL до разбора атрибутов; Linux-ветка этот код не исполняет. + Нужно согласовать обязательность выходов разборщика, проверять отсутствие/размер каждого выходного буфера + и проверить корректность заголовков/границ всех FreeBSD-уведомлений по актуальным определениям ОС. + При ошибке выдавать понятную диагностику socket/warn; проверить изменение/удаление адреса на FreeBSD. + Код не исправлялся, runtime-проверка FreeBSD не выполнялась. Аудит остановлен по AGENTS.md:10; + socket_monitor.h остаётся частично проверенным, остальные ветки lifecycle ещё требуют отдельной проверки. + +[+] **packet_dump: ограничить чтение входного IPv4-пакета** — исправлено 25.10.2026 по указанию пользователя. + Единый hex-цикл читает min(32, total length-IHL) байт; проверяются NULL/version/IHL/total length, + хвост после total length игнорируется. Адреса читаются побайтно; последующие IP-фрагменты + не выдаются за транспортный заголовок. Исправлены обрезание полного набора TCP-флагов и вывод нулевого порта. + Ошибки входа отражаются в строке и логируются в dump/warn, частичный первый фрагмент — dump/debug. + Прежний тест не вызывал модуль; теперь проверяет реальный форматтер: протоколы, поля, фрагменты, + 77 длин захвата, невыровненный вход, сохранность входа и точный hex в2904 случаях. + Контракты .h/документа согласованы. Код235c2c4f, тестыc3fa6d4d; rebase на e035f53a без конфликтов. + Обычная сборка PASS; полный check.sh после rebase:190/190 PASS,0 skipped, + proxy9/9,burst1/1,load8/8 PASS,134217728 байт,214с. Санитайзер-проверка пока выполняется. + Логи: /tmp/packet-dump-fix-test.log, /tmp/packet-dump-fix-full-check.log. [+] **member_files: сверить контракты и исправить ошибки владения/повторов** — завершено 24.10.2026. Прочитаны все6 реализаций и6 заголовков C-модуля. Исправлены удаление чужого temp, diff --git a/src/transport_layer/socket_monitor.h b/src/transport_layer/socket_monitor.h index 43280f44..90251a9a 100644 --- a/src/transport_layer/socket_monitor.h +++ b/src/transport_layer/socket_monitor.h @@ -1,7 +1,9 @@ /* socket_monitor — наблюдение за адресами интерфейсов и маршрутами ОС для ETCP-сокетов. * init подключает уведомления ОС к uasync экземпляра; изменения обновляют interface_addr и сетевое состояние. * auto_socket отдельно создаёт/удаляет сокеты. destroy отключает наблюдение до освобождения экземпляра. - * Публичные операции и изменения ETCP_SOCKET — в потоке uasync. */ + * Публичные операции и изменения ETCP_SOCKET — в потоке uasync. + * Аудит не завершён: FreeBSD-ветка обработки адреса передаёт NULL в bsd_parse_rtm, + * который без проверки пишет gw[0]; требуется исправление (см. doc/tasks.md). */ #ifndef SOCKET_MONITOR_H #define SOCKET_MONITOR_H