diff --git a/doc/media_async_audit_findings.txt b/doc/media_async_audit_findings.txt index 0b292a1c..18ccb342 100644 --- a/doc/media_async_audit_findings.txt +++ b/doc/media_async_audit_findings.txt @@ -1,6 +1,6 @@ Аудит media_async / media_delivery — 2026-10-24 -Статус: encrypted_file исправлен; продолжение аудита подтвердило отдельный дефект границы voice_file. -Полный аудит двух каталогов ещё не завершён. Новый дефект и проект исправления — в конце. +Статус: encrypted_file и отдельный дефект границы voice_file исправлены. +Полный аудит двух каталогов ещё не завершён. Граница voice_file и результаты исправления — в конце. Ниже сохранены исходное воспроизведение, согласованный проект и результаты исправления encrypted_file. Подтверждённый дефект: исходник уничтожается через другое имя того же файла @@ -258,7 +258,41 @@ attachment_send.c вызывает voice_file_encode в worker, а attachment_va Верхние границы проверять диагностической точкой до encoder без реального кодирования суток; сохранить существующий настоящий Opus roundtrip короткой записи. -Аудит остановлен по AGENTS.md:10 после подтверждения и подготовки проекта исправления. -Рабочий код не исправлялся. voice_file.h и attachment.h остаются [~]; оставшаяся -повторная проверка media_delivery не выполнялась. Новый общий тестовый/sanitizer-прогон -не запускался: в этом продолжении изменены только записи аудита, диагностика находится в /tmp. +На этапе подтверждения аудит был остановлен по AGENTS.md:10, без изменения рабочего кода. +Пользователь согласовал исправление; результаты приведены ниже. + +Результаты исправления voice_file — 2026-10-24 + +- ATTACHMENT_DURATION_MAX_MS в attachment.h задаёт один предел86400000мс: + его используют валидатор voice/video, video completion и кодировщик голоса. +- voice_file считает frames=count/frame и проверяет25..4320000 до создания Opus + и открытия выходного файла. Метаданные при раннем отказе не изменяются. + Хвост <20мс сохраняет прежнее поведение: отбрасывается, включая хвост после ровно24ч. +- Проверка архитектуры: frame всегда положителен и не больше1920 для разрешённых rate/channels; + деление count/frame не переполняется. После ограничения frames произведение frames*frame + не превосходит исходного count; frames*20 не превосходит86400000 и помещается в uint32_t. + Подготовка, публикация, владение PCM/файлом и формат контейнера не меняются. +- Лог раннего отказа содержит count/rate/channels/frames и разрешённые границы; + debug принятой записи показывает число кадров, длительность и отброшенный хвост. +- test_attachment: 120 граничных вызовов для пяти частот и mono/stereo. + Все70 недопустимых длительностей отвергнуты до encoder; все50 допустимых + дошли до диагностического encoder с инъекцией отказа. Во всех120 случаях + побайтно сохранены исходные metadata и содержимое существующего output. + Linux64 использует виртуальный read-only PCM; суточное кодирование не выполняется. +- Настоящий Opus encode/decode: прежняя1с запись и десять записей на500мс с хвостом + почти20мс, все rate/channels, все три preset. Проверены header, декодирование, + число20мс кадров, EOF и валидность метаданных результата. +- validate/encode/decode voice/video принимают86400000мс и отвергают86400001мс. +- ./build.sh --no-gui -j4 — PASS. В изменённых C-файлах/тесте предупреждений сборки нет; + общие прежние предупреждения остальных модулей остаются в полном логе. +- Профильные тесты10/10 PASS: attachment, attachment_send, encrypted_file, + encrypted_attachment, media_async, dm_media, dm_worker, services, video, video_no_ffmpeg. + Первый запуск attachment внутри sandbox выдал запреты создания stream fd; + весь профильный набор, включая attachment, успешно повторён вне sandbox. + +Логи: /tmp/media-voice-fix-build.log, /tmp/media-voice-fix-profile-results.log, +/tmp/media-voice-fix-profile-logs/test_attachment.log и остальные логи этого каталога. +Новый полный make check и ASAN/UBSan/LSan не запускались; прежние результаты encrypted_file +выше не относятся к этому изменению. Windows/FreeBSD не проверялись. +voice_file.h и attachment.h сохраняют [~]: завершение этого фикса не закрывает +оставшуюся сверку контрактов всего аудита. Повторная проверка media_delivery ещё не завершена. diff --git a/doc/tasks.md b/doc/tasks.md index 99530844..a64ed906 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,18 +4,22 @@ ## Текущие задачи -[ ] **media_async voice_file: согласовать верхнюю границу длительности с метаданными** — подтверждено 24.10.2026. - Проверка samples/channels/rate >86400 пропускает полные кадры 24ч+20..980мс, +[+] **media_async voice_file: согласовать верхнюю границу длительности с метаданными** — исправлено 24.10.2026. + Прежняя проверка samples/channels/rate >86400 пропускала полные кадры 24ч+20..980мс, хотя attachment_validate отклоняет duration_ms >86400000. В штатном pipeline это означает лишнюю подготовку файла перед отказом публикации; дефект относится к граничным записям длиннее суток. Диагностический вызов реального voice_file_encode с остановкой на создании Opus: 60 случаев, все пять частот и 1/2 канала; 20 подтверждённых расхождений проверки. /tmp/media-voice-duration-repro.c, /tmp/media-voice-duration-repro.mk, /tmp/media-voice-duration-repro.log. - План: общий предел миллисекунд в attachment.h; в voice_file проверять 25..4320000 полных кадров + Реализован общий предел миллисекунд в attachment.h; voice_file проверяет 25..4320000 полных кадров до создания encoder/открытия output. Валидатор и video completion используют тот же предел. - Регрессии: границы 500мс/24ч, отбрасывание хвоста <20мс и ранний отказ при превышении на полный кадр. + test_attachment: 120 граничных случаев; 70 ранних отказов, прежний файл и metadata сохранены. + Настоящий Opus encode/decode: 11 записей, включая 500мс с хвостом для всех пяти частот и 1/2 канала. + Границы метаданных voice/video 86400000/86400001мс проверены через validate/encode/decode. + ./build.sh --no-gui -j4 PASS; профильные тесты 10/10 PASS, включая DM, encrypted attachments и video. + Логи: /tmp/media-voice-fix-build.log, /tmp/media-voice-fix-profile-results.log, /tmp/media-voice-fix-profile-logs/. Подробности и ограничения воспроизведения: [media_async_audit_findings.txt](media_async_audit_findings.txt). - Рабочий код не изменён: аудит остановлен по AGENTS.md:10; полный аудит media_delivery ещё не завершён. + Полный аудит media_delivery ещё не завершён; новые полный check и sanitizer-прогоны не выполнялись. [+] **media_async encrypted_file: не уничтожать source через alias назначения** — исправлено 24.10.2026. write/read отвергают только одинаковые строки; /./ и hardlink обходят проверку одного файла.