fiber: panic on cancel of a recycled fiber
There was a user who complained about this code crashing: f = fiber_new_ex(...); fiber_start(f); fiber_cancel(f); The crash was at cancel. It happened because the fiber finished immediately. It was already recycled after fiber_start() return. Recycled fiber didn't have any flags, so fiber_cancel() didn't see the fiber was already dead and tried to wake it up. It crashed when the fiber tried to call its 'fiber->f' function which was NULL. In debug build the process fails earlier with an assertion on 'fiber->fid != 0'. It can't be really fixed because the problem is the same as with use-after-free. The fiber could be not recycled but already freed completely, returned back to the mempool. This patch tries to help the users by a panic with a message saying that it wasn't just a crash, it is a bug in user's code. There is an alternative - make fibers never return to the mempool. Then fiber_cancel() could ignore recycled fibers. But it would lead to another problem that if the fiber is already reused, then fiber_cancel() would hit a totally irrelevant fiber who was unlucky to reuse that fiber pointer. It seems worse than panic. Same problem exists for `fiber_wakeup()`, but I couldn't figure out how to add a panic there and not add an `if` on the normal execution path (which includes 'ready' and 'running' fibers). Closes #6837 NO_CHANGELOG=The same crash remains, but happens a bit earlier and with a message. @TarantoolBot document Title: `fiber_cancel()` C API clarification The documentation must warn that the fiber passed to `fiber_cancel()` must not be already dead unless it was set to be joinable. Same for `fiber_wakeup()` and all the other fiber functions. A dead non-joinable fiber could already be freed or reused.
Loading