diff --git a/changelogs/unreleased/gh-8975-box-iproto-override-without-cfg.md b/changelogs/unreleased/gh-8975-box-iproto-override-without-cfg.md new file mode 100644 index 0000000000000000000000000000000000000000..0442810ab5a7a3b729dad97bbb5bf9a6fc4825b0 --- /dev/null +++ b/changelogs/unreleased/gh-8975-box-iproto-override-without-cfg.md @@ -0,0 +1,4 @@ +## bugfix/box + +* Fixed a crash when `box.iproto.override` was called with unconfigured box. + Now, an error is raised instead (gh-8975). diff --git a/src/box/box.cc b/src/box/box.cc index 9963b1a2d340f3e8f3804af05e9560a13a0d463c..0d751332f52a00f7e5eedfd81820601440111733 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -4824,6 +4824,16 @@ box_is_configured(void) return is_box_configured; } +int +box_check_configured(void) +{ + if (!is_box_configured) { + diag_set(ClientError, ER_UNCONFIGURED); + return -1; + } + return 0; +} + static void box_cfg_xc(void) { diff --git a/src/box/box.h b/src/box/box.h index f50e1de77b92a21d04cc790b46b08c5aa8f1666d..5e10b41cee1643df0f58045e8b5e9735b521b44a 100644 --- a/src/box/box.h +++ b/src/box/box.h @@ -119,6 +119,12 @@ box_cfg(void); bool box_is_configured(void); +/** + * Return 0 if box has been configured, otherwise set diag and return -1. + */ +int +box_check_configured(void); + /** Check if the slice of main cord has expired. */ int box_check_slice_slow(void); diff --git a/src/box/errcode.h b/src/box/errcode.h index 919353395afacb8b4f89be658a6f3debfd0aa6e4..97c7c09a29f7f812c645caa547b71690cc9f9dc3 100644 --- a/src/box/errcode.h +++ b/src/box/errcode.h @@ -319,6 +319,14 @@ struct errcode_record { /*264 */_(ER_NIL_UUID, "Nil UUID is reserved and can't be used in replication") \ /*265 */_(ER_WRONG_FUNCTION_OPTIONS, "Wrong function options: %s") \ /*266 */_(ER_MISSING_SYSTEM_SPACES, "Snapshot has no system spaces") \ + /*267 */_(ER_UNUSED1, "") \ + /*268 */_(ER_UNUSED2, "") \ + /*269 */_(ER_UNUSED3, "") \ + /*270 */_(ER_UNUSED4, "") \ + /*271 */_(ER_UNUSED5, "") \ + /*272 */_(ER_UNUSED6, "") \ + /*273 */_(ER_UNUSED7, "") \ + /*274 */_(ER_UNCONFIGURED, "Please call box.cfg{} first") \ /* * !IMPORTANT! Please follow instructions at start of the file diff --git a/src/box/lua/iproto.c b/src/box/lua/iproto.c index 610ec9bdd6f16b146d1cbb2a85d042be530aad86..a476ea1f18db8db1d81adca6b064e22ec3882d20 100644 --- a/src/box/lua/iproto.c +++ b/src/box/lua/iproto.c @@ -313,6 +313,8 @@ lua_req_handler_destroy(void *ctx) static int lbox_iproto_override(struct lua_State *L) { + if (box_check_configured() != 0) + return luaT_error(L); int n_args = lua_gettop(L); if (n_args != 2) return luaL_error(L, "Usage: " diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua index ff6deb765cdfd083f1fe1657de1d6e8de96fccdd..5199ca18c6d29a230ada2e5d6893fa10fda6193a 100644 --- a/src/box/lua/load_cfg.lua +++ b/src/box/lua/load_cfg.lua @@ -983,9 +983,8 @@ for k, v in pairs(box) do end setmetatable(box, { - __index = function(table, index) -- luacheck: no unused args - error(debug.traceback("Please call box.cfg{} first")) - error("Please call box.cfg{} first") + __index = function() + box.error(box.error.UNCONFIGURED) end }) diff --git a/src/box/lua/session.c b/src/box/lua/session.c index a90027262b0c3e584118ccb4f52520c389c298dc..4db8dcd4a4f1da309df581a83ac457cc6dba824f 100644 --- a/src/box/lua/session.c +++ b/src/box/lua/session.c @@ -166,8 +166,8 @@ lbox_session_effective_user(struct lua_State *L) static int lbox_session_su(struct lua_State *L) { - if (!box_is_configured()) - luaL_error(L, "Please call box.cfg{} first"); + if (box_check_configured() != 0) + luaT_error(L); int top = lua_gettop(L); if (top < 1) luaL_error(L, "session.su(): bad arguments"); diff --git a/test/box-luatest/iproto_request_handlers_overriding_test.lua b/test/box-luatest/iproto_request_handlers_overriding_test.lua index e034b463a7015b1503fda2e5ebaf76446f5f6416..18731e06aa81fc830056152f99ad3516c4ccc7ac 100644 --- a/test/box-luatest/iproto_request_handlers_overriding_test.lua +++ b/test/box-luatest/iproto_request_handlers_overriding_test.lua @@ -123,6 +123,14 @@ g.after_all(function(cg) cg.server:drop() end) +-- Checks that `box.iproto.override` raises an error if called on +-- an unconfigured instance (gh-8975). +g.test_box_iproto_override_without_cfg = function() + t.assert_error_msg_equals('Please call box.cfg{} first', + box.iproto.override, box.iproto.type.UNKNOWN, + function() end) +end + -- Checks that `box.iproto.override` errors are handled correctly. g.test_box_iproto_override_errors = function(cg) cg.server:exec(function() diff --git a/test/box/error.result b/test/box/error.result index 68c20db041fc6d357425330ceae4620a3aa0eb27..4789fbfddadeb04ae0fb1a84c08556d905962724 100644 --- a/test/box/error.result +++ b/test/box/error.result @@ -484,6 +484,7 @@ t; | 264: box.error.NIL_UUID | 265: box.error.WRONG_FUNCTION_OPTIONS | 266: box.error.MISSING_SYSTEM_SPACES + | 274: box.error.UNCONFIGURED | ... test_run:cmd("setopt delimiter ''");