Skip to content
This repository was archived by the owner on Oct 20, 2024. It is now read-only.

Conversation

@eunikolsky
Copy link

An app using PocketSocket crashes occasionally with this information:

Fatal Exception: NSInvalidArgumentException
-[SomeDelegate webSocketDidFlushOutput:]: unrecognized selector sent to instance 0x123456789
0  CoreFoundation                 0x88881ad8c __exceptionPreprocess
…
5  PocketSocket                   0x8888d5004 __43-[PSWebSocket notifyDelegateDidFlushOutput]_block_invoke (PSWebSocket.m:668)
6  libdispatch.dylib              0x88880caa0 _dispatch_call_block_and_release
…

The notifyDelegateDidFlushOutput function checks if the delegate
responds to the webSocketDidFlushOutput: selector before sending it.
The only possible cause for the crash is when the delegate changes
between the check and the call because the function is not atomic. Added
testChangingDelegateWhileFlushingOutputShouldNotCrashWithUnrecognizedSelector
can reproduce the crash very quickly and consistently.

The fix here is to capture the delegate strongly while the function is
running to work with the same instance. The patch fixes the crash in all
similar places in PSWebSocket, as well as in PSWebSocketServer.

An app using `PocketSocket` crashes occasionally with this information:

```
Fatal Exception: NSInvalidArgumentException
-[SomeDelegate webSocketDidFlushOutput:]: unrecognized selector sent to instance 0x123456789
0  CoreFoundation                 0x88881ad8c __exceptionPreprocess
…
5  PocketSocket                   0x8888d5004 __43-[PSWebSocket notifyDelegateDidFlushOutput]_block_invoke (PSWebSocket.m:668)
6  libdispatch.dylib              0x88880caa0 _dispatch_call_block_and_release
…
```

The `notifyDelegateDidFlushOutput` function checks if the delegate
responds to the `webSocketDidFlushOutput:` selector before sending it.
The only possible cause for the crash is when the delegate changes
between the check and the call because the function is not atomic. Added
`testChangingDelegateWhileFlushingOutputShouldNotCrashWithUnrecognizedSelector`
can reproduce the crash very quickly and consistently.

The fix here is to capture the delegate strongly while the function is
running to work with the same instance. The patch fixes the crash in all
similar places in `PSWebSocket`, as well as in `PSWebSocketServer`.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant