[Tarantool-patches] [PATCH 2/2] fiber: fiber_join -- don't crash on misuse

Cyrill Gorcunov gorcunov at gmail.com
Mon Apr 26 13:10:00 MSK 2021


In case if we call jiber_join() over the nonjoinable fiber
we trigger an assert and crash execution (on debug build).

On release build the asserts will be zapped and won't cause
problems but there is an another one -- the target fiber will
cause double fiber_reset() calls which in result cause to
unregister_fid with id = 0 (not causing crash but definitely
out of intention) and we will drop stack protection which
might be not ours anymore.

Thus lets return error just like Lua interface does. Since
nobody complained about this bug yet I think such combination
is not use commonly in external C modules and we can change
the API behaviour.

Fixes #6046

Signed-off-by: Cyrill Gorcunov <gorcunov at gmail.com>
---
 src/lib/core/fiber.c | 5 ++++-
 test/unit/fiber.cc   | 3 +++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/lib/core/fiber.c b/src/lib/core/fiber.c
index baf78a130..dd7498dd7 100644
--- a/src/lib/core/fiber.c
+++ b/src/lib/core/fiber.c
@@ -615,7 +615,10 @@ fiber_join(struct fiber *fiber)
 int
 fiber_join_timeout(struct fiber *fiber, double timeout)
 {
-	assert(fiber->flags & FIBER_IS_JOINABLE);
+	if (!(fiber->flags & FIBER_IS_JOINABLE)) {
+		diag_set(IllegalParams, "the fiber is not joinable");
+		return -1;
+	}
 
 	if (! fiber_is_dead(fiber)) {
 		bool exceeded = false;
diff --git a/test/unit/fiber.cc b/test/unit/fiber.cc
index 9c1a23bdd..fbdd82772 100644
--- a/test/unit/fiber.cc
+++ b/test/unit/fiber.cc
@@ -96,6 +96,9 @@ fiber_join_test()
 	header();
 
 	struct fiber *fiber = fiber_new_xc("join", noop_f);
+	/* gh-6046: crash on attempt to join non joinable */
+	fiber_set_joinable(fiber, false);
+	fiber_join(fiber);
 	fiber_set_joinable(fiber, true);
 	fiber_wakeup(fiber);
 	fiber_join(fiber);
-- 
2.30.2



More information about the Tarantool-patches mailing list