Record streaming signature OOM defect and completed temp fix

This commit is contained in:
evgeny committed 2026-10-24 00:46:40 +02:00
1 parent 5792db996c
commit 5a7823e6ef
1 file changed
+19 -8
+19 -8
View File
@@ -67,14 +67,25 @@
Логи: /tmp/etcp-attempts-matrix.log, /tmp/etcp-attempts-asan-test_*.log,
/tmp/etcp-oom-reinit-asan-test_*.log, /tmp/etcp-abort-encrypted-recovery.log.
[ ] **Media: очистка кеша удаляет временный файл активной загрузки** — подтверждено 23.10.2026:
test_encrypted_attachment зависает в phase=3: orphan_walk_cb удаляет .uenc.tmp.<id>,
следующий BLOCK_CHUNK получает ENOENT и завершает загрузку с ошибкой.
chat_media_cache_cleanup_orphans защищает cipher_path и старое имя .part, но не фактический temp загрузки.
Нужна защита файлов, которыми владеют активные media_delivery/download, через их реестр владения;
проверять по фактическим путям, без угадывания суффикса. ETCP REINIT в воспроизведении отсутствует.
Лог: /tmp/utun_encrypted_attachment_HwkBUM/test.log (удаление → отказ записи),
/tmp/etcp-oom-reinit-full-check.log; профильные OOM/ETCP sanitizer-тесты проходят.
[ ] **Crypto: повторное освобождение ключа после отказа инициализации потоковой подписи** — подтверждено 24.10.2026:
sc_stream_sign_init и sc_stream_sign_verify_init при отказе EVP_MD_CTX_new освобождают state->pkey,
но оставляют указатель в state; последующий sc_stream_sign_cleanup освобождает его повторно.
Та же незавершённая очистка есть при отказе EVP_DigestInit_ex. Активное состояние перед повторным init
также требует явного контракта: текущий memset теряет ссылки на его ресурсы.
Привести состояния после отказов к безопасному cleanup, определить контракт повторного init в .h,
добавить инъекции отказов выделения/инициализации и проверки cleanup/final/verify с ASAN/UBSan.
Временное воспроизведение на штатной libutun.a: два отказа EVP_MD_CTX_new, два повторных free;
диагностический wrapper фиксирует и подавляет второй free. Лог: /tmp/sc-sign-init-oom-repro.log,
исходник: /tmp/sc-sign-init-oom-repro.c. Исполняемый код проекта в этой проверке не менялся.
[+] **Media: очистка кеша удаляла временный файл активной загрузки** — исправлено 24.10.2026:
file_io хранит общий защищённый mutex реестр владельцев temp по фактическим нормализованным путям.
Владение сохраняется от создания до publish/discard, включая интервал после finish; очистка кеша
проверяет владение и удаляет сироту под тем же mutex. Угадывание суффиксов не используется.
Регрессии проверяют открытый/закрытый temp, барьеры создания/finish и очистку после реального BLOCK_CHUNK.
Полный check.sh: 184/184, proxy9/9, burst1/1, load8/8 PASS; пять профильных тестов ASAN/UBSan PASS,
test_encrypted_attachment дополнительно повторён пять раз без отказов.
Логи: /tmp/media-orphan-full-check.log, /tmp/media-orphan-asan-*.log, /tmp/media-orphan-repeat-*.log.
[+] **ETCP: входящий INIT сохранял устаревший признак обратной достижимости** — исправлено 23.10.2026:
Принятый INIT обновляет RX и remote_keepalive до переиспользования буфера для ответа; flag_up=0 снимает ложный UP.