From 878328206904bf71017e952b174e4331d7f8e8fc Mon Sep 17 00:00:00 2001 From: Ilya Verbin <iverbin@tarantool.org> Date: Wed, 12 Oct 2022 17:31:35 +0300 Subject: [PATCH] box: forbid non-string types in key_def.new() Currently if a non-string type is passed to luaT_key_def_set_part, lua_tolstring returns null-pointer type_name, which is passed to a string formatting function in diag_set. Closes #5222 NO_DOC=bugfix (cherry picked from commit 5215f3f3b43c8f355206344caa33f29d69765a00) --- .../unreleased/gh-5222-key_def-type-null.md | 4 +++ src/box/lua/key_def.c | 6 ++-- .../gh_5222_key_def_invalid_type_test.lua | 28 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/gh-5222-key_def-type-null.md create mode 100644 test/box-luatest/gh_5222_key_def_invalid_type_test.lua diff --git a/changelogs/unreleased/gh-5222-key_def-type-null.md b/changelogs/unreleased/gh-5222-key_def-type-null.md new file mode 100644 index 0000000000..f89c9d2cf4 --- /dev/null +++ b/changelogs/unreleased/gh-5222-key_def-type-null.md @@ -0,0 +1,4 @@ +## bugfix/box + +* Fixed a bug when `type = box.NULL` in `key_def.new()` resulted in + `type = 'unsigned'` (gh-5222). diff --git a/src/box/lua/key_def.c b/src/box/lua/key_def.c index 1147b9c326..321bdad3f8 100644 --- a/src/box/lua/key_def.c +++ b/src/box/lua/key_def.c @@ -124,8 +124,10 @@ luaT_key_def_set_part(struct lua_State *L, struct key_part_def *part, /* Set part->type. */ lua_pushstring(L, "type"); lua_gettable(L, -2); - if (lua_isnil(L, -1)) { - diag_set(IllegalParams, "type must not be nil"); + if (!lua_isstring(L, -1)) { + diag_set(IllegalParams, + "Wrong field type: expected string, got %s", + lua_typename(L, lua_type(L, -1))); return -1; } size_t type_len; diff --git a/test/box-luatest/gh_5222_key_def_invalid_type_test.lua b/test/box-luatest/gh_5222_key_def_invalid_type_test.lua new file mode 100644 index 0000000000..ebe2f4a249 --- /dev/null +++ b/test/box-luatest/gh_5222_key_def_invalid_type_test.lua @@ -0,0 +1,28 @@ +local t = require('luatest') +local g = t.group('gh-5222') + +g.test_key_def_invalid_type = function() + local key_def = require('key_def') + + t.assert_error_msg_content_equals("Wrong field type: expected string, got nil", function() + key_def.new({{field = 1, type = nil}}) + end) + t.assert_error_msg_content_equals("Wrong field type: expected string, got cdata", function() + key_def.new({{field = 1, type = box.NULL}}) + end) + t.assert_error_msg_content_equals("Wrong field type: expected string, got table", function() + key_def.new({{field = 1, type = {}}}) + end) + t.assert_error_msg_content_equals("Wrong field type: expected string, got boolean", function() + key_def.new({{field = 1, type = true}}) + end) + t.assert_error_msg_content_equals("Unknown field type: 2989", function() + key_def.new({{field = 1, type = 2989}}) + end) + t.assert_error_msg_content_equals("Unknown field type: bad", function() + key_def.new({{field = 1, type = 'bad'}}) + end) + t.assert_error_msg_content_equals("Unknown field type: ", function() + key_def.new({{field = 1, type = ''}}) + end) +end -- GitLab