Record verified media QUERY fixes and regression coverage

This commit is contained in:
evgeny committed 2026-10-22 18:31:13 +02:00
1 parent 21ebc832e1
commit 433a091db5
1 file changed
+22 -24
+22 -24
View File
@@ -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 и доставленной первой пачке.