diff --git a/changelogs/unreleased/gh-9283-fix-crash-on-gc-collect.md b/changelogs/unreleased/gh-9283-fix-crash-on-gc-collect.md new file mode 100644 index 0000000000000000000000000000000000000000..d35973abc4c5b17df58d8dad4813b6e42c0fcd6a --- /dev/null +++ b/changelogs/unreleased/gh-9283-fix-crash-on-gc-collect.md @@ -0,0 +1,3 @@ +## bugfix/http + +* Fixed a crash on garbage collection of httpc objects (gh-9283). diff --git a/src/curl.c b/src/curl.c index 8f2f0fb49166348a6bd1fc3c4fd8fc36b1e4c928..da8e6b9fbde8fe9b146ffb782c2468d5b8a8c688 100644 --- a/src/curl.c +++ b/src/curl.c @@ -262,8 +262,20 @@ void curl_env_destroy(struct curl_env *env) { assert(env); - if (env->multi != NULL) + if (env->multi != NULL) { + CURL **list = curl_multi_get_handles(env->multi); + if (list) { + for (int i = 0; list[i]; i++) { + /* We are not interested in mcode and + * setting curl_diag_set_merror, because + * it is a destructor. + */ + curl_multi_remove_handle(env->multi, list[i]); + } + curl_free(list); + } curl_multi_cleanup(env->multi); + } mempool_destroy(&env->sock_pool); }