Skip to content

Commit 0c4c45a

Browse files
authored
fix use-after-free in BridgeJS (#690)
fix use-after-free
1 parent 5529520 commit 0c4c45a

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

Sources/JavaScriptKit/BridgeJSIntrinsics.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,12 @@ extension JSObject: _BridgedSwiftStackType {
420420
}
421421

422422
@_spi(BridgeJS) public consuming func bridgeJSLowerReturn() -> Int32 {
423-
return _swift_js_retain(Int32(bitPattern: self.id))
423+
// withExtendedLifetime is required here to prevent a use-after-free.
424+
// In a `consuming func`, Swift ARC may release `self` (and thus release
425+
// the underlying JS reference) as soon as it extracts `self.id`, which
426+
// happens *before* `_swift_js_retain` is called. `withExtendedLifetime` forces
427+
// `self` to stay alive until after `_swift_js_retain` returns.
428+
return withExtendedLifetime(self) { _swift_js_retain(Int32(bitPattern: self.id)) }
424429
}
425430

426431
@_spi(BridgeJS) public consuming func bridgeJSStackPush() {

0 commit comments

Comments
 (0)