curl: initialize and cleanup global curl state #4554
Merged
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.
The documentation of curl states that any program making use of libcurl
is responsible for calling
curl_global_init
previous to using anycurl functions, and
curl_global_cleanup
when the program is about toterminate. We currently call neither. While this seems to work just
fine, Valgrind may complain about unfree'd memory.
Fix the issue by correctly setting up and tearing down libcurl.
Edit for the corrected reasoning behind this PR:
Our curl-based streams make use of the easy curl interface. This
interface automatically initializes and de-initializes the global curl
state by calling out to
curl_global_init
andcurl_global_cleanup
.Thus, all global state will be repeatedly re-initialized when creating
multiple curl streams in succession. Despite being inefficient, this is
not thread-safe due to
curl_global_init
being not thread-safe itself.Thus a multi-threaded programing handling multiple curl streams at the
same time is inherently racy.
Fix the issue by globally initializing and cleaning up curl's state.