@@ -600,7 +600,7 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
600600 if (!Z_ISUNDEF (retval )) {
601601 _php_curl_verify_handlers (ch , /* reporterror */ true);
602602 /* TODO Check callback returns an int or something castable to int */
603- length = zval_get_long (& retval );
603+ length = php_curl_get_long (& retval );
604604 }
605605
606606 zval_ptr_dtor (& argv [0 ]);
@@ -633,7 +633,7 @@ static int curl_fnmatch(void *ctx, const char *pattern, const char *string)
633633 if (!Z_ISUNDEF (retval )) {
634634 _php_curl_verify_handlers (ch , /* reporterror */ true);
635635 /* TODO Check callback returns an int or something castable to int */
636- rval = zval_get_long (& retval );
636+ rval = php_curl_get_long (& retval );
637637 }
638638 zval_ptr_dtor (& argv [0 ]);
639639 zval_ptr_dtor (& argv [1 ]);
@@ -670,7 +670,7 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double
670670 if (!Z_ISUNDEF (retval )) {
671671 _php_curl_verify_handlers (ch , /* reporterror */ true);
672672 /* TODO Check callback returns an int or something castable to int */
673- if (0 != zval_get_long (& retval )) {
673+ if (0 != php_curl_get_long (& retval )) {
674674 rval = 1 ;
675675 }
676676 }
@@ -708,7 +708,7 @@ static size_t curl_xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow,
708708 if (!Z_ISUNDEF (retval )) {
709709 _php_curl_verify_handlers (ch , /* reporterror */ true);
710710 /* TODO Check callback returns an int or something castable to int */
711- if (0 != zval_get_long (& retval )) {
711+ if (0 != php_curl_get_long (& retval )) {
712712 rval = 1 ;
713713 }
714714 }
@@ -807,6 +807,7 @@ static int curl_ssh_hostkeyfunction(void *clientp, int keytype, const char *key,
807807 }
808808 } else {
809809 zend_throw_error (NULL , "The CURLOPT_SSH_HOSTKEYFUNCTION callback must return either CURLKHMATCH_OK or CURLKHMATCH_MISMATCH" );
810+ zval_ptr_dtor (& retval );
810811 }
811812 }
812813
@@ -901,7 +902,7 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx
901902 if (!Z_ISUNDEF (retval )) {
902903 // TODO: Check for valid int type for return value
903904 _php_curl_verify_handlers (ch , /* reporterror */ true);
904- length = zval_get_long (& retval );
905+ length = php_curl_get_long (& retval );
905906 }
906907 zval_ptr_dtor (& argv [0 ]);
907908 zval_ptr_dtor (& argv [1 ]);
@@ -1322,6 +1323,17 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
13221323 (* source -> clone )++ ;
13231324}
13241325
1326+ zend_long php_curl_get_long (zval * zv )
1327+ {
1328+ if (EXPECTED (Z_TYPE_P (zv ) == IS_LONG )) {
1329+ return Z_LVAL_P (zv );
1330+ } else {
1331+ zend_long ret = zval_get_long (zv );
1332+ zval_ptr_dtor (zv );
1333+ return ret ;
1334+ }
1335+ }
1336+
13251337static size_t read_cb (char * buffer , size_t size , size_t nitems , void * arg ) /* {{{ */
13261338{
13271339 struct mime_data_cb_arg * cb_arg = (struct mime_data_cb_arg * ) arg ;
0 commit comments