mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-31 11:18:21 +08:00
mdbx: устранение возможности SIGSEGV
внутри coherency_check()
(backport).
Падение происходило в случае когда: - Некоторый процесс увеличивал размер БД с изменением геометрии (с увеличением предельного размера БД и её отображения в ОЗУ), затем задействовал страницу из добавленного сегмента в качестве корневой для FreeDB/GC и/или MainDB и фиксировал транзакцию. - Другой процесс, уже работавший с БД до изменения геометрии первым процессом, запускал транзакцию чтения. Падение происходило при проверке «когерентности» отображения страниц БД в ОЗУ, при проверке отметок модификации внутри корневых страниц, так как в этом случае они были вне границ текущего отображения БД в адресном пространстве этого процесса. Похоже что в ходе какого-то рефакторинга потерялась соответствующая проверка. Этот коммит добавляет такую проверку.
This commit is contained in:
parent
cf6d441e1b
commit
497aabcb2e
@ -16,6 +16,10 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic
|
|||||||
к падению **отладочных сборок**, так как в них соответствующий массив
|
к падению **отладочных сборок**, так как в них соответствующий массив
|
||||||
намеренно заполнен некорректными указателями.
|
намеренно заполнен некорректными указателями.
|
||||||
|
|
||||||
|
- Устранение возможности `SIGSEGV` внутри `coherency_check()` после
|
||||||
|
изменения геометрии другим процессом с увеличением верхнего размера БД
|
||||||
|
и увеличением БД больше предыдущего лимита.
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -8703,7 +8703,9 @@ static bool coherency_check(const MDBX_env *env, const txnid_t txnid,
|
|||||||
: "(wagering meta)");
|
: "(wagering meta)");
|
||||||
ok = false;
|
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));
|
VALGRIND_MAKE_MEM_DEFINED(freedb_root, sizeof(freedb_root->mp_txnid));
|
||||||
MDBX_ASAN_UNPOISON_MEMORY_REGION(freedb_root,
|
MDBX_ASAN_UNPOISON_MEMORY_REGION(freedb_root,
|
||||||
sizeof(freedb_root->mp_txnid));
|
sizeof(freedb_root->mp_txnid));
|
||||||
@ -8719,7 +8721,9 @@ static bool coherency_check(const MDBX_env *env, const txnid_t txnid,
|
|||||||
ok = false;
|
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));
|
VALGRIND_MAKE_MEM_DEFINED(maindb_root, sizeof(maindb_root->mp_txnid));
|
||||||
MDBX_ASAN_UNPOISON_MEMORY_REGION(maindb_root,
|
MDBX_ASAN_UNPOISON_MEMORY_REGION(maindb_root,
|
||||||
sizeof(maindb_root->mp_txnid));
|
sizeof(maindb_root->mp_txnid));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user