Record packet dump fix and FreeBSD socket monitor finding

This commit is contained in:
evgeny committed 2026-10-25 22:44:55 +01:00
1 parent ce30ec5fe6
commit dd81f7a665
2 files changed
+24 -14

No files matched your search

+21 -13
View File
@@ -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,
+3 -1
View File
@@ -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