@@ -436,10 +436,12 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
436
436
zend_list_addref (ch -> id );
437
437
ZVAL_STRINGL (argv [1 ], data , length , 1 );
438
438
439
+ ch -> in_callback = 1 ;
439
440
error = call_user_function (EG (function_table ),
440
441
NULL ,
441
442
t -> func ,
442
443
retval , 2 , argv TSRMLS_CC );
444
+ ch -> in_callback = 0 ;
443
445
if (error == FAILURE ) {
444
446
php_error (E_WARNING , "%s(): Couldn't call the CURLOPT_WRITEFUNCTION" ,
445
447
get_active_function_name (TSRMLS_C ));
@@ -495,10 +497,12 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
495
497
zend_list_addref (t -> fd );
496
498
ZVAL_LONG (argv [2 ], (int ) size * nmemb );
497
499
500
+ ch -> in_callback = 1 ;
498
501
error = call_user_function (EG (function_table ),
499
502
NULL ,
500
503
t -> func ,
501
504
retval , 3 , argv TSRMLS_CC );
505
+ ch -> in_callback = 0 ;
502
506
if (error == FAILURE ) {
503
507
php_error (E_WARNING , "%s(): Cannot call the CURLOPT_READFUNCTION" ,
504
508
get_active_function_name (TSRMLS_C ));
@@ -553,10 +557,12 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx
553
557
zend_list_addref (ch -> id );
554
558
ZVAL_STRINGL (argv [1 ], data , length , 1 );
555
559
560
+ ch -> in_callback = 1 ;
556
561
error = call_user_function (EG (function_table ),
557
562
NULL ,
558
563
t -> func ,
559
564
retval , 2 , argv TSRMLS_CC );
565
+ ch -> in_callback = 0 ;
560
566
if (error == FAILURE ) {
561
567
php_error (E_WARNING , "%s(): Couldn't call the CURLOPT_HEADERFUNCTION" ,
562
568
get_active_function_name (TSRMLS_C ));
@@ -606,10 +612,12 @@ static size_t curl_passwd(void *ctx, char *prompt, char *buf, int buflen)
606
612
ZVAL_STRING (argv [1 ], prompt , 1 );
607
613
ZVAL_LONG (argv [2 ], buflen );
608
614
615
+ ch -> in_callback = 1 ;
609
616
error = call_user_function (EG (function_table ),
610
617
NULL ,
611
618
func ,
612
619
retval , 2 , argv TSRMLS_CC );
620
+ ch -> in_callback = 0 ;
613
621
if (error == FAILURE ) {
614
622
php_error (E_WARNING , "%s(): Couldn't call the CURLOPT_PASSWDFUNCTION" , get_active_function_name (TSRMLS_C ));
615
623
} else if (Z_TYPE_P (retval ) == IS_STRING ) {
@@ -680,7 +688,9 @@ static void alloc_curl_handle(php_curl **ch)
680
688
(* ch )-> handlers -> write_header = ecalloc (1 , sizeof (php_curl_write ));
681
689
(* ch )-> handlers -> read = ecalloc (1 , sizeof (php_curl_read ));
682
690
memset (& (* ch )-> err , 0 , sizeof ((* ch )-> err ));
683
-
691
+
692
+ (* ch )-> in_callback = 0 ;
693
+
684
694
zend_llist_init (& (* ch )-> to_free .str , sizeof (char * ),
685
695
(void (* )(void * )) curl_free_string , 0 );
686
696
zend_llist_init (& (* ch )-> to_free .slist , sizeof (struct curl_slist ),
@@ -1337,7 +1347,11 @@ PHP_FUNCTION(curl_close)
1337
1347
WRONG_PARAM_COUNT ;
1338
1348
}
1339
1349
ZEND_FETCH_RESOURCE (ch , php_curl * , zid , -1 , le_curl_name , le_curl );
1340
-
1350
+
1351
+ if (ch -> in_callback ) {
1352
+ php_error_docref (NULL TSRMLS_CC , E_WARNING , "Attempt to close CURL handle from a callback" );
1353
+ return ;
1354
+ }
1341
1355
zend_list_delete (Z_LVAL_PP (zid ));
1342
1356
}
1343
1357
/* }}} */
0 commit comments