File tree Expand file tree Collapse file tree 1 file changed +6
-1
lines changed
Expand file tree Collapse file tree 1 file changed +6
-1
lines changed Original file line number Diff line number Diff 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( ) {
You can’t perform that action at this time.
0 commit comments