[Tarantool-patches] [PATCH v4] lua/key_def: fix compare_with_key() part count check

Sergey Nikiforov void at tarantool.org
Tue Dec 22 11:28:06 MSK 2020


Added corresponding test

Fixes: #5307
---

Issue: https://github.com/tarantool/tarantool/issues/5307
Branch: https://github.com/tarantool/tarantool/tree/void234/gh-5307-fix-key_def-part-count-check-v4

 src/box/lua/key_def.c                         |  9 +++----
 .../gh-5307-key_def-part-count-check.test.lua | 26 +++++++++++++++++++
 2 files changed, 29 insertions(+), 6 deletions(-)
 create mode 100755 test/box-tap/gh-5307-key_def-part-count-check.test.lua

diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c
index a781aeff9..5143ef3a4 100644
--- a/src/box/lua/key_def.c
+++ b/src/box/lua/key_def.c
@@ -360,17 +360,14 @@ lbox_key_def_compare_with_key(struct lua_State *L)
 	struct region *region = &fiber()->gc;
 	size_t region_svp = region_used(region);
 	size_t key_len;
-	const char *key_end, *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
-	uint32_t part_count = mp_decode_array(&key);
-	if (key_validate_parts(key_def, key, part_count, true,
-			       &key_end) != 0) {
+	const char *key = lbox_encode_tuple_on_gc(L, 3, &key_len);
+	if (box_key_def_validate_key(key_def, key, NULL)) {
 		region_truncate(region, region_svp);
 		tuple_unref(tuple);
 		return luaT_error(L);
 	}
 
-	int rc = tuple_compare_with_key(tuple, HINT_NONE, key,
-					part_count, HINT_NONE, key_def);
+	int rc = box_tuple_compare_with_key(tuple, key, key_def);
 	region_truncate(region, region_svp);
 	tuple_unref(tuple);
 	lua_pushinteger(L, rc);
diff --git a/test/box-tap/gh-5307-key_def-part-count-check.test.lua b/test/box-tap/gh-5307-key_def-part-count-check.test.lua
new file mode 100755
index 000000000..d9458c95a
--- /dev/null
+++ b/test/box-tap/gh-5307-key_def-part-count-check.test.lua
@@ -0,0 +1,26 @@
+#!/usr/bin/env tarantool
+
+local tap = require('tap')
+local mytest = tap.test('key_def part count tests')
+
+mytest:plan(3)
+
+local key_def = require('key_def')
+local kd = key_def.new({{fieldno = 1, type = 'unsigned'}})
+local ok, res
+
+-- Should succeed
+ok, res = pcall(kd.compare_with_key, kd, {1}, {1})
+mytest:ok(ok and res == 0, "Simple equality")
+
+-- Should succeed
+ok, res = pcall(kd.compare_with_key, kd, {1}, {2})
+mytest:ok(ok and res < 0, "Simple inequality")
+
+-- Should fail
+local exp_err = "Invalid key part count (expected [0..1], got 9)"
+ok, res = pcall(kd.compare_with_key, kd, {1}, {1, 2, 3, 4, 5, 6, 7, 8, 9})
+mytest:is_deeply({ok, tostring(res)}, {false, exp_err},
+    "Invalid key part count")
+
+os.exit(mytest:check() and 0 or 1)
-- 
2.25.1



More information about the Tarantool-patches mailing list