Use a shared queue for URLSessions to prevent crash during _MultiHandle.deinit #5016
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
We've seen various crashes in
libcryptothat occur followingURLSession._MultiHandle.deinit. The crash was particularly frequent on Amazon Linux 2 (see swiftlang/swift-package-manager#7624), and generally follows a similar pattern to this backtrace:curlcan be configured with various TLS libraries, and OpenSSL is a common choice. Previously, eachURLSessionhad its own work queue, but given that "OpenSSL is not completely thread-safe, and unfortunately not all global resources have the necessary locks" (source), andURLSessiondoes not account for this, this sometimes led to the above crash in multi-threaded contexts.It appears that certain versions of OpenSSL might be more or less susceptible to this crash, but given that
curlcan be built with a wide array of versions, or even different TLS libraries, the only effective fix we found was to makeURLSessionsingle-threaded by sharing a target queue for all sessions. This is similar to the loader queuing behavior on Darwin.Thanks to @guoye-zhang, @AnkshitJain, and @bnbarham for help debugging/discovering this fix!