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:
Леонид Юрьев (Leonid Yuriev) 2022-12-05 19:14:08 +03:00
parent a772a9d3e1
commit 48eeb93628

View File

@ -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);