mirror of
https://github.com/isar/libmdbx.git
synced 2025-01-02 00:04:12 +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:
parent
a772a9d3e1
commit
48eeb93628
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user