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);
 }