From ad0505bd316d1beaf3c4ed7379bc661fe9756b37 Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 22 Oct 2026 13:40:39 +0200 Subject: [PATCH] Record verified media primitive fixes and remaining location audit --- doc/tasks.md | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/doc/tasks.md b/doc/tasks.md index 14584497..78ddade9 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,18 +4,27 @@ ## Текущие задачи -[ ] **media_async: файловые примитивы и точные контракты .h** — аудит 22.10.2026: - ma_copy_file проверяет только strcmp: source и ./source обнуляют исходный файл (14→0 байт), возврат 0. - Одинаковые строки несуществующего пути также дают 0 без проверки источника; правила перезаписи/ошибок не описаны. - ma_uuid игнорирует отказ RAND_bytes: при внедрённой ошибке буфер остаётся прежним, вызывающий не получает ошибку. - ma_dir_walk молча возвращает 0 для отсутствующего каталога/обычного файла; ошибки opendir/lstat/readdir не передаются. - Windows-ветка рекурсирует по DIRECTORY без проверки REPARSE_POINT; regular-only контракт .h требует уточнения/реализации. - ma_file_size сужает st_size до int: 3 ГиБ возвращают -1073741824. Ограничение int в .h указано, - но вызывающие media_index/chat_msg используют результат как int64_t: расширение после вызова не восстанавливает размер. - В .h уточнить синхронные done при отказе, -2 также для неверных аргументов/closing, отсутствие callback при done=NULL, - лимит 16 задач до доставки done (включая завершённые workers), размеры ключа/подписи и отсутствие отката побочных эффектов work. - Порядок join→cancel post→done при destroy сверён с uasync и doc/service_lifecycle.md; описание этого порядка соответствует коду. - Стенд вне репозитория: /tmp/media-async-audit.c; результаты: /tmp/media-async-audit.log. Реализация не менялась. +[+] **media_async: файловые примитивы и точные контракты .h** — исправлено 22.10.2026: + ma_copy_file проверяет существование/идентичность, сохраняет один regular-файл при ./ или hardlink; + ссылки назначения отклоняются, копирование идёт через соседний temp с проверенными записью/close/publish. + Общие примитивы lib/file_io используются также video, сохраняя публикацию видео только в completion. + ma_uuid возвращает ошибку RNG и обнуляет выход; media_index не записывает результат при отказе media/block UUID. + ma_file_size и переменные вызывающего кода — int64_t; проверяются смещения, число блоков и размеры выделений. + Обход передаёт ошибки, пропускает ссылки/reparse points, проверяет длину/глубину; Windows использует wide API. + Контракты .h и service_lifecycle описывают синхронные отказы, лимит 16 до completion и отсутствие отката work при отмене. + Неверные аргументы дают -1, closing/destroy — CANCELLED; повторный вход в destroy диагностируется и отклоняется. + Новый test_media_primitives проверяет сохранность при I/O/fdopen ошибках, RNG/seek без записей в БД, + sparse-размеры на границах 2/4 ГиБ, ошибки обхода, ссылки/глубину и ownership задач с внедрением ошибок. + Все шесть тестов media_primitives/video/media_index/attachment_send/services/dm_worker прошли ASAN/UBSan с detect_leaks=1. + Общий check.sh: 176/176 и proxy/burst/load. Windows runtime/сборка не проверялись: кросс-компилятора в окружении нет. + Логи: /tmp/media-primitives-full-check-final.log, /tmp/media-primitives-final.log, /tmp/media-asan-test_*.log. + +[ ] **media_index_commit: не обрезать длинный location** — статическая проверка 22.10.2026: + Относительный dest_path записывается через snprintf в location[512] без проверки длины; + register_async допускает dest_path до 1023 байт, а media_base может не сокращать его до 511 байт. + При таком пути в БД попадёт обрезанное имя. Проверить сценарий на реальном вложенном пути, + затем отклонять непредставимый location до INSERT либо согласовать размеры со всеми читателями. + Найдено при сверке вызывающего кода media_async; воспроизведение и исправление отложены. [+] **test_stream_service: убрать зависимость bootstrap-проверки от гонки TCP-handshake** — исправлено 22.10.2026: Падение на строке 409: REINIT=0 при probes=1/subflows=1/failures=0 и доставленной первой пачке.