From c457804fad3732f827506b530b00d8c796b9d916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Thu, 20 Mar 2025 01:46:13 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=D1=83=D1=80=D1=81=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=D0=BE=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85=20=D1=82=D1=80=D0=B0=D0=BD=D0=B7=D0=B0?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8F=D1=85=20(backport).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api-cursor.c | 6 ++---- src/cursor.c | 13 ++++++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/api-cursor.c b/src/api-cursor.c index 18396299..f5f09c20 100644 --- a/src/api-cursor.c +++ b/src/api-cursor.c @@ -690,11 +690,9 @@ MDBX_txn *mdbx_cursor_txn(const MDBX_cursor *mc) { if (unlikely(!mc || mc->signature != cur_signature_live)) return nullptr; MDBX_txn *txn = mc->txn; - if (unlikely(!txn || txn->signature != txn_signature)) + if (unlikely(!txn || txn->signature != txn_signature || (txn->flags & MDBX_TXN_FINISHED))) return nullptr; - if (unlikely(txn->flags & MDBX_TXN_FINISHED)) - return nullptr; - return txn; + return (txn->flags & MDBX_TXN_HAS_CHILD) ? txn->env->txn : txn; } MDBX_dbi mdbx_cursor_dbi(const MDBX_cursor *mc) { diff --git a/src/cursor.c b/src/cursor.c index 8a96387d..b313a78f 100644 --- a/src/cursor.c +++ b/src/cursor.c @@ -2347,14 +2347,21 @@ int cursor_check(const MDBX_cursor *mc, int txn_bad_bits) { (char *)mc - stack_top < (ptrdiff_t)globals.sys_pagesize * 4)); if (txn_bad_bits) { - int rc = check_txn(mc->txn, txn_bad_bits); + int rc = check_txn(mc->txn, txn_bad_bits & ~MDBX_TXN_HAS_CHILD); if (unlikely(rc != MDBX_SUCCESS)) { cASSERT(mc, rc != MDBX_RESULT_TRUE); return rc; } - if (unlikely(cursor_dbi_changed(mc))) - return MDBX_BAD_DBI; + if (likely((mc->txn->flags & MDBX_TXN_HAS_CHILD) == 0)) + return likely(!cursor_dbi_changed(mc)) ? MDBX_SUCCESS : MDBX_BAD_DBI; + + cASSERT(mc, (mc->txn->flags & MDBX_TXN_RDONLY) == 0 && mc->txn != mc->txn->env->txn && mc->txn->env->txn); + rc = dbi_check(mc->txn->env->txn, cursor_dbi(mc)); + if (unlikely(rc != MDBX_SUCCESS)) + return rc; + + cASSERT(mc, (mc->txn->flags & MDBX_TXN_RDONLY) == 0 && mc->txn == mc->txn->env->txn); } return MDBX_SUCCESS;