From 497aabcb2e162fe917d7e0d6c500be194f20a5ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Wed, 7 Aug 2024 21:22:57 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D1=83=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20`SIGSEGV`=20=D0=B2=D0=BD=D1=83?= =?UTF-8?q?=D1=82=D1=80=D0=B8=20`coherency=5Fcheck()`=20(backport).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Падение происходило в случае когда: - Некоторый процесс увеличивал размер БД с изменением геометрии (с увеличением предельного размера БД и её отображения в ОЗУ), затем задействовал страницу из добавленного сегмента в качестве корневой для FreeDB/GC и/или MainDB и фиксировал транзакцию. - Другой процесс, уже работавший с БД до изменения геометрии первым процессом, запускал транзакцию чтения. Падение происходило при проверке «когерентности» отображения страниц БД в ОЗУ, при проверке отметок модификации внутри корневых страниц, так как в этом случае они были вне границ текущего отображения БД в адресном пространстве этого процесса. Похоже что в ходе какого-то рефакторинга потерялась соответствующая проверка. Этот коммит добавляет такую проверку. --- ChangeLog.md | 4 ++++ src/core.c | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 5c7480d7..157e2235 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,10 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic к падению **отладочных сборок**, так как в них соответствующий массив намеренно заполнен некорректными указателями. + - Устранение возможности `SIGSEGV` внутри `coherency_check()` после + изменения геометрии другим процессом с увеличением верхнего размера БД + и увеличением БД больше предыдущего лимита. + -------------------------------------------------------------------------------- diff --git a/src/core.c b/src/core.c index 86d3a812..2b6bf969 100644 --- a/src/core.c +++ b/src/core.c @@ -8703,7 +8703,9 @@ static bool coherency_check(const MDBX_env *env, const txnid_t txnid, : "(wagering meta)"); ok = false; } - if (likely(freedb_root && freedb_mod_txnid)) { + if (likely(freedb_root && freedb_mod_txnid && + (size_t)ptr_dist(env->me_dxb_mmap.base, freedb_root) < + env->me_dxb_mmap.limit)) { VALGRIND_MAKE_MEM_DEFINED(freedb_root, sizeof(freedb_root->mp_txnid)); MDBX_ASAN_UNPOISON_MEMORY_REGION(freedb_root, sizeof(freedb_root->mp_txnid)); @@ -8719,7 +8721,9 @@ static bool coherency_check(const MDBX_env *env, const txnid_t txnid, ok = false; } } - if (likely(maindb_root && maindb_mod_txnid)) { + if (likely(maindb_root && maindb_mod_txnid && + (size_t)ptr_dist(env->me_dxb_mmap.base, maindb_root) < + env->me_dxb_mmap.limit)) { VALGRIND_MAKE_MEM_DEFINED(maindb_root, sizeof(maindb_root->mp_txnid)); MDBX_ASAN_UNPOISON_MEMORY_REGION(maindb_root, sizeof(maindb_root->mp_txnid));