@@ -143,6 +143,12 @@ void curl_async_shutdown(void)
143
143
}
144
144
145
145
if (curl_multi_handle != NULL ) {
146
+ // Pre-cleanup. Bug in CURL prior to 8.14.
147
+ curl_multi_setopt (curl_multi_handle , CURLMOPT_SOCKETFUNCTION , NULL );
148
+ curl_multi_setopt (curl_multi_handle , CURLMOPT_TIMERFUNCTION , NULL );
149
+ curl_multi_setopt (curl_multi_handle , CURLMOPT_SOCKETDATA , NULL );
150
+ curl_multi_setopt (curl_multi_handle , CURLMOPT_TIMERDATA , NULL );
151
+
146
152
curl_multi_cleanup (curl_multi_handle );
147
153
curl_multi_handle = NULL ;
148
154
}
@@ -278,6 +284,10 @@ static void curl_poll_callback(
278
284
279
285
static int curl_socket_cb (CURL * curl , const curl_socket_t socket_fd , const int what , void * user_p , void * socket_poll )
280
286
{
287
+ if (UNEXPECTED (curl_multi_handle == NULL )) {
288
+ return CURLM_OK ;
289
+ }
290
+
281
291
if (what == CURL_POLL_REMOVE ) {
282
292
if (socket_poll != NULL ) {
283
293
zend_async_poll_event_t * socket_event = socket_poll ;
@@ -353,6 +363,10 @@ static void timer_callback(
353
363
354
364
static int curl_timer_cb (CURLM * multi , const long timeout_ms , void * user_p )
355
365
{
366
+ if (UNEXPECTED (curl_multi_handle == NULL )) {
367
+ return CURLM_OK ;
368
+ }
369
+
356
370
if (timeout_ms < 0 ) {
357
371
// Cancel timer - in new API this is handled automatically by waker cleanup
358
372
if (timer != NULL ) {
0 commit comments