From 404899d8166a0d16f9d16bf1726ba9d62d6994cf Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov <gorcunov@gmail.com> Date: Sat, 23 Feb 2019 16:34:42 +0300 Subject: [PATCH] lua/fiber: Fix abort on malformed join input If I create a new fiber and the join to himself we get an abort: | tarantool> f = require('fiber') | --- | ... | | tarantool> f.join(f.self()) | tarantool: src/fiber.c:407: fiber_join: Assertion `fiber->flags & FIBER_IS_JOINABLE' failed. | Aborted (core dumped) we should better throw an error. --- src/lua/fiber.c | 6 +++++- test/app/fiber.result | 8 ++++++++ test/app/fiber.test.lua | 6 ++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lua/fiber.c b/src/lua/fiber.c index 8b17d64756..336be60a28 100644 --- a/src/lua/fiber.c +++ b/src/lua/fiber.c @@ -676,10 +676,14 @@ lbox_fiber_join(struct lua_State *L) { struct fiber *fiber = lbox_checkfiber(L, 1); struct lua_State *child_L = fiber->storage.lua.stack; - fiber_join(fiber); struct error *e = NULL; int num_ret = 0; int coro_ref = 0; + + if (!(fiber->flags & FIBER_IS_JOINABLE)) + luaL_error(L, "the fiber is not joinable"); + fiber_join(fiber); + if (child_L != NULL) { coro_ref = lua_tointeger(child_L, -1); lua_pop(child_L, 1); diff --git a/test/app/fiber.result b/test/app/fiber.result index 1649d59bda..94e690f6cf 100644 --- a/test/app/fiber.result +++ b/test/app/fiber.result @@ -1454,6 +1454,14 @@ ch1:put(1) while f:status() ~= 'dead' do fiber.sleep(0.01) end --- ... +-- +-- Test if fiber join() does not crash +-- if unjoinable +-- +fiber.join(fiber.self()) +--- +- error: the fiber is not joinable +... -- cleanup test_run:cmd("clear filter") --- diff --git a/test/app/fiber.test.lua b/test/app/fiber.test.lua index ee22087bd9..bb8c249905 100644 --- a/test/app/fiber.test.lua +++ b/test/app/fiber.test.lua @@ -623,6 +623,12 @@ ch1:put(1) while f:status() ~= 'dead' do fiber.sleep(0.01) end +-- +-- Test if fiber join() does not crash +-- if unjoinable +-- +fiber.join(fiber.self()) + -- cleanup test_run:cmd("clear filter") -- GitLab