diff --git a/doc/chat_audit_findings.txt b/doc/chat_audit_findings.txt index ad181e821..f25483d05 100644 --- a/doc/chat_audit_findings.txt +++ b/doc/chat_audit_findings.txt @@ -1320,3 +1320,58 @@ member_files_network,JOIN,attachment,feedback/poll. Desktop/APK build PASS; GUI12/12,включая test_group_avatars,и JVM155/155 (31 suite) PASS. Логи:/tmp/chat-avatar-final-{desktop-build,android-build,gui-results}.log. Fetch не принёс изменений;group_avatar.h/doc отмечены[V],прочий chat/ продолжается. + +Снимки участников и диагностика — 27.10.2026,послеd3c5565c + +Полностью прочитаны chat_member.c/.h и chat_status.c,сверены реальные GUI/JNI +потребители и существующие group-scoped тесты services/radio. Negative control +/tmp/chat-member-negative.log:ошибка finalize снимка даёт rc0/count1;новый +test_chat_member на прежнем коде ожидаемо упал. Теперь все SQL-этапы завершаются +до публикации out;отказ оставляет list NULL/count0 и прежний single-buffer. +Callback свойств использует тот же single-query вместо предварительного SELECT. + +Предел полного списка65535 согласован с u16 count события. Превышение запрещено +целиком;рост массива ограничен,квадратичная insertion sort заменена qsort по +online DESC,unsigned node_id ASC. Сериализатор дополняет обе строки NUL, +включая хвост avatar_file. NULL/stopped/malformed trampoline-запросы логируются +и освобождаются. Общий тихий validator канонического ID1..INT64_MAX используется +описанием create/JOIN и member API;caller добавляет диагностический контекст. + +radio_set_member_muted теперь владеет BEGIN IMMEDIATE/COMMIT;проверяются bind, +step,changes1,finalize,COMMIT и finalize загрузки кэша. Память резервируется +до записи,содержимое кэша/аудио меняется после commit. Чужая транзакция +отклоняется;rollback failure с открытой транзакцией запрашивает owner-stop. +Чат готовит снимок до переключения и меняет в нём committed флаг без нового +SQL-чтения после commit. Удалённая аудио-callback группа не получает устаревшее +MEMBER_UPDATED. Сам отказ последующего чтения не превращает переключатель +в ложную ошибку. Отдельного negative control старого radio-пути не запускали. + +Фиксированные8192-байтовые буферы status/metrics с неограниченным накоплением +snprintf заменены checked strbuf;при OOM/форматировании нет частичного события. +В strbuf устранено сужение size_t к32-битному allocator и небезопасное удвоение +capacity;новый init с2^32 отклоняется до выделения нулевого блока. Node-name +lookup проверяет SQL/нулевой размер и очищает допустимый выход при ошибке. +Бинарный conn-list ограничен250 до переполнения count,links/inflight насыщаются; +member-detail проверяет finalize,насыщает счётчики,его parser принимает короткий +INVALID ответ с нулевыми полями неверного запроса,совпадающий с producer. + +Новый test_chat_member:9 SQL/память отказов снимка с повторами,отказ property +callback без события,9 SQL/память отказов mute с повторами,ABORT/IGNORE/veto/ +foreign txn/read-error after commit/failed rollback+owner-close. Независимый +reader,audio callback и display event подтверждают согласованность DB/cache/ +звука/флага после commit. Проверены4 SQL-отказа detail,4 name lookup,неверные +trampoline args/NUL,точные65535 sorted records/event и отказ65536 без усечения, +status/metrics с300 линками>8КиБ,отказ strbuf без частичного события и повтор, +граница allocator2^32;учёт аллокаций вернулся к baseline. +PASS:/tmp/chat-member-final-unit.log. Ранний профиль member/services/radio3/3 +до расширения matrix:/tmp/chat-member-first-{test,services,radio}.log. + +Диагностические ошибки fixture отражены отдельно:после неуспешной сборки +(не хватало ETCP include) случайно запущен прежний бинарник;его PASS не засчитан. +Новый собранный fixture затем упал на NULL ack_q искусственных300 линков: +core817181,/home/user/.cache/utun-audit/chat-member-matrix.core,backtrace однозначно +указал queue_total_bytes в collect_conn_metrics. Добавлена действительная пустая +ACK-очередь,а не NULL вместо обязательного ресурса;новый запуск прошёл. +Это ошибка fixture,не доказательство runtime-багa. Позднее имя node fixture +задано явно,чтобы проверка не зависела от fallback Me. Новая общая проверка +runtime41b35033/testcec3e27a выполняется отдельно;весь chat/ ещё не закрыт. diff --git a/doc/tasks.md b/doc/tasks.md index 0f8bd3ea7..72ac18989 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,17 @@ ## Текущие задачи +[+] **chat_member/status: полный снимок,границы формата и committed mute** — 27.10.2026. + Подтверждён ложный успех снимка после finalize error;теперь SQL/память не дают частичный список. + Список ограничен65535 записями,сортируется qsort (online,unsigned node_id);строки wire дополняются NUL. + Запросы/канальные ID проверяются до чтения;callback свойств использует один завершённый SELECT. + radio_set_member_muted владеет транзакцией,кэш/аудио обновляются после commit;чат готовит снимок до изменения, + последующий SQL-отказ не превращает сохранённый переключатель в ошибку. Чужая транзакция запрещена. + Диагностика использует checked strbuf;member_detail проверяет finalize и согласованный error codec. + test_chat_member:SQL/память/ABORT/IGNORE/veto/foreign/rollback,readonly DB+cache+audio observer, + 65535/65536 участников,300 линков,OOM и allocator boundary PASS. Общие проверки — в отчёте. + Подробнее:[chat_audit_findings.txt](chat_audit_findings.txt),«Снимки участников и диагностика». + [+] **group_avatar: атомарная публикация, проверенное чтение и безопасное событие приёма** — 27.10.2026. Подтверждён прежний ложный успех при отказе bind SHA256. set/apply владеют BEGIN IMMEDIATE/COMMIT, проверяют все SQL-этапы,отклоняют чужую транзакцию;события/STATE идут после commit.