diff --git a/doc/tasks.md b/doc/tasks.md index ff582a69..68accbdf 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -76,32 +76,30 @@ Логи: /tmp/media-index-full-check-final.log, /tmp/media-index-final-test_media_index_regressions.log, /tmp/media-index-asan-test_*.log. Новый тест: tests/test_media_index_regressions.c. -[ ] **media_delivery QUERY/QUERY_RESP: проверять длины до чтения записей** — воспроизведено 22.10.2026: - QUERY: передан только заголовок 27 байт, num_blocks=1. md_handle_query передаёт SQLite указатель - на block_id за концом payload; чтение 16 байт происходит в md_ba_find_nodes → sqlite3_step. - QUERY_RESP: заголовок 3 байта, num_entries=1; md_dl_block_index читает 16 байт за концом payload. - Оба случая подтверждены ASAN use-after-poison с защищённой границей payload: u_malloc округляет выделение, - поэтому физическая граница malloc сама по себе не соответствует длине входящего пакета. - Проверять полный размер массивов и допустимые счётчики до SQL, поиска загрузки и любых изменений состояния. - Стенд /tmp/media-query-audit.c; логи /tmp/media-query-request-asan.log, /tmp/media-query-response-asan.log. +[+] **media_delivery QUERY/QUERY_RESP: проверять длины до чтения записей** — исправлено 22.10.2026: + Проверяются точный размер, счётчики и все записи до SQL/изменений состояния. Ответ связан с media_id, + UUID попытки, группой и end-to-end отправителем router; дубликаты, истёкшие и старые ответы игнорируются. + test_media_query защищает точную границу payload под ASAN и проверяет все усечения, чужие ответы, + повреждение последней записи без изменения первой, отмену и повторный start того же media_id. -[ ] **media_delivery QUERY: устранить потерю блоков и держателей из-за разных лимитов** — воспроизведено 22.10.2026: - Реальный router callback, ответ перехвачен на etcp_route_send: запрос 65 блоков с одним держателем каждого - даёт один ответ с 64 записями; 65-й блок не рассматривается (nb принудительно обрезается до 64). - Запрос 64 блоков с четырьмя держателями каждого даёт 68 записей только для первых 17 блоков: - resp[2048] заполняется и остальные сведения молча теряются. Простого запрета num_blocks>64 недостаточно. - Загрузчик отдельно обрезает num_entries до 100: в полном ответе на 101 запись последний блок остаётся без держателя. - Согласовать размер запросов/ответов и модель частичных ответов. Учесть, что при каждом QUERY_RESP загрузчик - сбрасывает держателей всех неактивных незавершённых блоков, а не только блоков из этого ответа. - Обычное разбиение ответа на пакеты без изменения этого поведения не даёт гарантии сохранения списка. - Стенд /tmp/media-query-audit.c, лог /tmp/media-query-audit.log; исходники реализации не менялись. +[+] **media_delivery QUERY: устранить потерю блоков и держателей из-за разных лимитов** — исправлено 22.10.2026: + Одна пачка до 32 block_id — один полный ответ, до четырёх кандидатов на каждый блок (максимум 1604 байта). + Нулевой результат и ошибка БД различаются. Неполная пачка не принимается; держатели других пачек и текущие CM сохраняются. + QUERY имеет отдельный дедлайн и курсор источников каждого блока; чанки не продлевают поиск остальных блоков. + Источники своей CHAT-группы, автор последний; HAVE_BLOCK не зависит от курсора поиска. + Peer-слоты переиспользуются после освобождения; SLOT/SEARCH/RETRY различаются, OVERLOADED соблюдает retry_after. + Отменяется поздний CM UP, события обрабатываются после open. Устранено двойное освобождение при отказе router. + Проверены 65 блоков/260 записей, старт 4100 блоков, сборка с 13 держателями при 10 слотах, + настоящий watchdog при входящих чанках, SQL-ошибка второго блока, RNG/send failures и отсутствие повторного done_cb. + Сетевой integration проверяет содержимое QUERY_RESP вместо безусловного smoke PASS. + Восемь тестов query/delivery_download/download_timeout/delivery_sql/delivery_integration/delivery_chat/delivery_full/services + прошли ASAN/UBSan с detect_leaks=1. Первый общий check.sh: 178/178, proxy/burst/load PASS, 188с. + Логи: /tmp/media-query-regressions.log, /tmp/media-query-full-check.log, /tmp/media-query-asan-final-test_*.log. + Windows runtime/сборка не проверялись: кросс-компилятора нет. Контракты — в соответствующих .h. -[ ] **media_delivery QUERY_RESP: передавать правильный chunk** — воспроизведено 22.10.2026: - md_handle_query записывает q->num_blocks в chunk каждой записи ответа вместо номера блока. - Для запроса на 65 блоков все 64 возвращённые записи имеют chunk=65 при исходных chunk=0..63. - Нужен номер блока из записи availability/media_files; позиция в выборочном запросе тоже не обязана совпадать с chunk. - Текущий загрузчик ищет по block_id и chunk ответа не использует, но wire-поле содержит неверные данные. - Лог /tmp/media-query-audit.log: wrong_chunks=64 (затем 68 в сценарии с несколькими держателями). +[+] **media_delivery QUERY_RESP: устранить неверное поле chunk** — исправлено 22.10.2026: + Неиспользуемые chunk/rtt удалены из нового формата QUERY_RESP. Блок однозначно задаётся block_id, + а его номер загрузчик берёт из сохранённых метаданных; позиция в выборочной пачке не считается номером блока. [+] **test_stream_service: убрать зависимость bootstrap-проверки от гонки TCP-handshake** — исправлено 22.10.2026: Падение на строке 409: REINIT=0 при probes=1/subflows=1/failures=0 и доставленной первой пачке.