Record verified media QUERY fixes and regression coverage
This commit is contained in:
1 parent
21ebc832e1
commit
433a091db5
1 file changed
+22
-24
+22
-24
@@ -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 и доставленной первой пачке.
|
||||
|
||||
Reference in new issue
Block a user