summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-02-07 19:46:11 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-02-07 19:46:11 +0300
commit5c4715aea7dc5bda704924448d2d74380f75c0b0 (patch)
treebdff3c35d07634b67efe9ab8514b761ad6c2a565
parent3c7699f80c5c4b8be13731c36d4deb4c6cc8eefe (diff)
fixes #2205 (Unable to create new profile)
-rw-r--r--libs/libmdbx/src/README.md3
-rw-r--r--libs/libmdbx/src/mdbx.h3
-rw-r--r--libs/libmdbx/src/src/elements/core.c28
-rw-r--r--plugins/Dbx_mdbx/src/dbcrypt.cpp29
4 files changed, 39 insertions, 24 deletions
diff --git a/libs/libmdbx/src/README.md b/libs/libmdbx/src/README.md
index 1b2fb69bdd..d5c24f5545 100644
--- a/libs/libmdbx/src/README.md
+++ b/libs/libmdbx/src/README.md
@@ -1,3 +1,5 @@
+<!-- Required extensions: pymdownx.betterem, pymdownx.tilde, pymdownx.emoji, pymdownx.tasklist, pymdownx.superfences -->
+
libmdbx
=======
@@ -554,4 +556,3 @@ syscall and by scanning data directory.
--------------------------------------------------------------------------------
### The [repository now only mirrored on the Github](https://abf.io/erthink/libmdbx) due to illegal discriminatory restrictions for Russian Crimea and for sovereign crimeans.
-<!-- Required extensions: pymdownx.betterem, pymdownx.tilde, pymdownx.emoji, pymdownx.tasklist, pymdownx.superfences -->
diff --git a/libs/libmdbx/src/mdbx.h b/libs/libmdbx/src/mdbx.h
index fba8c4602b..8c9c865129 100644
--- a/libs/libmdbx/src/mdbx.h
+++ b/libs/libmdbx/src/mdbx.h
@@ -1508,8 +1508,7 @@ typedef enum MDBX_cursor_op {
* since it opened in read-only mode */
#define MDBX_WANNA_RECOVERY (-30419)
-/* The given key value is mismatched to the current cursor position,
- * when mdbx_cursor_put() called with MDBX_CURRENT option. */
+/* The given key value is mismatched to the current cursor position */
#define MDBX_EKEYMISMATCH (-30418)
/* Database is too large for current system,
diff --git a/libs/libmdbx/src/src/elements/core.c b/libs/libmdbx/src/src/elements/core.c
index d1cf8979ae..306ce6bc3b 100644
--- a/libs/libmdbx/src/src/elements/core.c
+++ b/libs/libmdbx/src/src/elements/core.c
@@ -2493,13 +2493,13 @@ static int lcklist_detach_locked(MDBX_env *env) {
TYPE_LIST *const begin = first, *const end = begin + length; \
\
while (length > 3) { \
- const unsigned half = length >> 1; \
- TYPE_LIST *const middle = first + half; \
+ const unsigned whole = length; \
+ length >>= 1; \
+ TYPE_LIST *const middle = first + length; \
if (CMP(*middle, item)) { \
first = middle + 1; \
- length -= half + 1; \
- } else \
- length = half; \
+ length = whole - length - 1; \
+ } \
} \
\
switch (length) { \
@@ -2507,17 +2507,21 @@ static int lcklist_detach_locked(MDBX_env *env) {
if (!CMP(*first, item)) \
break; \
++first; \
- /* fall through */ \
- __fallthrough; \
+ __fallthrough /* fall through */; \
case 2: \
if (!CMP(*first, item)) \
break; \
++first; \
- /* fall through */ \
- __fallthrough; \
+ __fallthrough /* fall through */; \
case 1: \
- if (CMP(*first, item)) \
- ++first; \
+ if (!CMP(*first, item)) \
+ break; \
+ ++first; \
+ __fallthrough /* fall through */; \
+ case 0: \
+ break; \
+ default: \
+ __unreachable(); \
} \
\
if (mdbx_audit_enabled()) { \
@@ -3176,7 +3180,7 @@ static const char *__mdbx_strerr(int errnum) {
"MDBX_VERSION_MISMATCH: DB version mismatch libmdbx",
"MDBX_INVALID: File is not an MDBX file",
"MDBX_MAP_FULL: Environment mapsize limit reached",
- "MDBX_DBS_FULL: Too may DBI-handles (maxdbs reached)",
+ "MDBX_DBS_FULL: Too many DBI-handles (maxdbs reached)",
"MDBX_READERS_FULL: Too many readers (maxreaders reached)",
NULL /* MDBX_TLS_FULL (-30789): unused in MDBX */,
"MDBX_TXN_FULL: Transaction has too many dirty pages,"
diff --git a/plugins/Dbx_mdbx/src/dbcrypt.cpp b/plugins/Dbx_mdbx/src/dbcrypt.cpp
index 8cdc884c6f..75a630aa72 100644
--- a/plugins/Dbx_mdbx/src/dbcrypt.cpp
+++ b/plugins/Dbx_mdbx/src/dbcrypt.cpp
@@ -202,11 +202,15 @@ int CDbxMDBX::InitCrypt()
if (m_crypto != nullptr)
return 0;
- txn_ptr_ro txn(m_txn_ro);
+ int rc;
+ MDBX_val key = { DBKey_Crypto_Provider, sizeof(DBKey_Crypto_Provider) }, value;
+ {
+ txn_ptr_ro txn(m_txn_ro);
+ rc = mdbx_get(txn, m_dbCrypto, &key, &value);
+ }
CRYPTO_PROVIDER *pProvider;
- MDBX_val key = { DBKey_Crypto_Provider, sizeof(DBKey_Crypto_Provider) }, value;
- if (mdbx_get(txn, m_dbCrypto, &key, &value) == MDBX_SUCCESS) {
+ if (rc == MDBX_SUCCESS) {
pProvider = Crypto_GetProvider((const char*)value.iov_base);
if (pProvider == nullptr)
pProvider = SelectProvider();
@@ -220,7 +224,12 @@ int CDbxMDBX::InitCrypt()
return 3;
key.iov_len = sizeof(DBKey_Crypto_Key); key.iov_base = DBKey_Crypto_Key;
- if (mdbx_get(txn, m_dbCrypto, &key, &value) == MDBX_SUCCESS && (value.iov_len == m_crypto->getKeyLength())) {
+ {
+ txn_ptr_ro txn(m_txn_ro);
+ rc = mdbx_get(txn, m_dbCrypto, &key, &value);
+ }
+
+ if (rc == MDBX_SUCCESS && (value.iov_len == m_crypto->getKeyLength())) {
if (!m_crypto->setKey((const BYTE*)value.iov_base, value.iov_len)) {
CEnterPasswordDialog dlg(this);
while (true) {
@@ -243,11 +252,13 @@ int CDbxMDBX::InitCrypt()
}
key.iov_len = sizeof(DBKey_Crypto_IsEncrypted); key.iov_base = DBKey_Crypto_IsEncrypted;
-
- if (mdbx_get(txn, m_dbCrypto, &key, &value) == MDBX_SUCCESS)
- m_bEncrypted = *(const bool*)value.iov_base;
- else
- m_bEncrypted = false;
+ {
+ txn_ptr_ro txn(m_txn_ro);
+ if (mdbx_get(txn, m_dbCrypto, &key, &value) == MDBX_SUCCESS)
+ m_bEncrypted = *(const bool *)value.iov_base;
+ else
+ m_bEncrypted = false;
+ }
InitDialogs();
return 0;