From 034f1d6a88d49767c2c5d64ac9467167372b694d Mon Sep 17 00:00:00 2001 From: lihan3238 Date: Wed, 6 May 2026 01:48:47 +0800 Subject: [PATCH 1/2] fix(FiberHandle): prevent clear() from wiping newer fiber during interrupt wait Save a reference to the target fiber before interrupting, then only clear if the stored fiber still matches the target. This prevents a race where another fiber calls run()/set() during the interrupt wait window and gets its reference unconditionally wiped. Fixes #5906 --- packages/effect/src/FiberHandle.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/effect/src/FiberHandle.ts b/packages/effect/src/FiberHandle.ts index d9112671abf..e2eb3859832 100644 --- a/packages/effect/src/FiberHandle.ts +++ b/packages/effect/src/FiberHandle.ts @@ -313,10 +313,12 @@ export const clear = (self: FiberHandle): Effect.Effect => if (self.state._tag === "Closed" || self.state.fiber === undefined) { return Effect.void } + const target = self.state.fiber + return Effect.zipRight( - restore(Fiber.interruptAs(self.state.fiber, FiberId.combine(fiber.id(), internalFiberId))), + restore(Fiber.interruptAs(target, FiberId.combine(fiber.id(), internalFiberId))), Effect.sync(() => { - if (self.state._tag === "Open") { + if (self.state._tag === "Open" && self.state.fiber === target) { self.state.fiber = undefined } }) From ce27cb7b82227b36b547a6bf030738cb9ab45125 Mon Sep 17 00:00:00 2001 From: lihan3238 Date: Fri, 8 May 2026 12:12:55 +0800 Subject: [PATCH 2/2] add changeset --- .changeset/fix-fiberhandle-clear.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fix-fiberhandle-clear.md diff --git a/.changeset/fix-fiberhandle-clear.md b/.changeset/fix-fiberhandle-clear.md new file mode 100644 index 00000000000..9b2d91e037a --- /dev/null +++ b/.changeset/fix-fiberhandle-clear.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +fix(FiberHandle): prevent clear() from wiping newer fiber during interrupt wait