mirror of
https://github.com/isar/libmdbx.git
synced 2025-10-28 14:38:59 +08:00
mdbx: исправление падения в env_close() при закрытии среды пере-открытой в режиме только-для-чтения.
Ошибка не была замечена ранее из-за много-ходового сценария воспроизведения:
1. Создаём экземпляр MDBX_env посредством mdbx_env_create();
2. Пытаемся открыть БД посредством mdbx_env_open() в режиме
чтения-записи и эта попытка должны быть неудачной;
3. Не освобождая экземпляр MDBX_env повторно открываем его в режиме
только-чтение;
4. Закрываем среду посредством mdbx_env_close().
Падение происходит на пункте 4, либо на пункте 3, если попытка
повторного открытия будет не успешной.
Причина в том, что внутренний экземпляр osal_ioring_t инициализировался
только для режимов чтения-записи, а разрушался всегда. При этом после
первого разрушения намеренно оставался в состоянии вызывающем падение
при использовании без инициализации.
[Simon Leier](https://t.me/leisim) сообщал об этой проблеме (теперь
понятно что это было), но из-за сложности сценария проблему не удалось
воспроизвести и идентифицировать.
This commit is contained in:
@@ -14671,7 +14671,8 @@ __cold static int env_close(MDBX_env *env) {
|
||||
}
|
||||
|
||||
munlock_all(env);
|
||||
osal_ioring_destroy(&env->me_ioring);
|
||||
if (!(env->me_flags & MDBX_RDONLY))
|
||||
osal_ioring_destroy(&env->me_ioring);
|
||||
|
||||
lcklist_lock();
|
||||
const int rc = lcklist_detach_locked(env);
|
||||
|
||||
Reference in New Issue
Block a user