From c153a343824ebc5da64787179b310a3547f0ca9c 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: Fri, 22 Mar 2024 16:28:41 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20`mdbx=5Fcursor=5Fscan()`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Упрощение и обеспечение возврата `MDBX_RESULT_FALSE`, как при отсутствии данных, так и при неуспешном поиске. - Инициализация внутренних переменных key и value для устойчивости в случае использования контекстно-некорректных операций позиционирования курсора. --- src/core.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/core.c b/src/core.c index 18465a64..04357264 100644 --- a/src/core.c +++ b/src/core.c @@ -17721,18 +17721,15 @@ int mdbx_cursor_scan(MDBX_cursor *mc, MDBX_predicate_func *predicate, if (unlikely(turn_op > 30 || ((1 << turn_op) & valid_turn_mask) == 0)) return MDBX_EINVAL; - MDBX_val key, data; + MDBX_val key = {nullptr, 0}, data = {nullptr, 0}; int rc = mdbx_cursor_get(mc, &key, &data, start_op); - if (unlikely(rc != MDBX_SUCCESS)) - return rc; - for (;;) { + while (likely(rc == MDBX_SUCCESS)) { rc = predicate(context, &key, &data, arg); if (rc != MDBX_RESULT_FALSE) return rc; rc = cursor_get(mc, &key, &data, turn_op); - if (rc != MDBX_SUCCESS) - return (rc == MDBX_NOTFOUND) ? MDBX_RESULT_FALSE : rc; } + return (rc == MDBX_NOTFOUND) ? MDBX_RESULT_FALSE : rc; } int mdbx_cursor_scan_from(MDBX_cursor *mc, MDBX_predicate_func *predicate,