diff --git a/.changeset/neat-pens-yawn.md b/.changeset/neat-pens-yawn.md new file mode 100644 index 00000000..a7434921 --- /dev/null +++ b/.changeset/neat-pens-yawn.md @@ -0,0 +1,5 @@ +--- +'@livekit/rtc-node': patch +--- + +Clear pending timeout in AudioSource.close() to prevent use-after-free diff --git a/packages/livekit-rtc/src/audio_source.ts b/packages/livekit-rtc/src/audio_source.ts index 16096b87..7ffe9dbc 100644 --- a/packages/livekit-rtc/src/audio_source.ts +++ b/packages/livekit-rtc/src/audio_source.ts @@ -145,6 +145,14 @@ export class AudioSource { } async close() { + // Clear any pending playout timeout so its callback doesn't fire after + // the handle is disposed, which would reference freed native state. + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = undefined; + } + // Resolve any pending waitForPlayout() promise so callers don't hang. + this.release(); this.ffiHandle.dispose(); this.closed = true; }