@@ -623,7 +623,7 @@ static size_t curl_write(char *data, size_t size, size_t nmemb, void *ctx)
623623 length = -1 ;
624624 } else if (!Z_ISUNDEF (retval )) {
625625 _php_curl_verify_handlers (ch , /* reporterror */ true);
626- length = zval_get_long (& retval );
626+ length = php_curl_get_long (& retval );
627627 }
628628
629629 zval_ptr_dtor (& argv [0 ]);
@@ -667,7 +667,7 @@ static int curl_fnmatch(void *ctx, const char *pattern, const char *string)
667667 php_error_docref (NULL , E_WARNING , "Cannot call the CURLOPT_FNMATCH_FUNCTION" );
668668 } else if (!Z_ISUNDEF (retval )) {
669669 _php_curl_verify_handlers (ch , /* reporterror */ true);
670- rval = zval_get_long (& retval );
670+ rval = php_curl_get_long (& retval );
671671 }
672672 zval_ptr_dtor (& argv [0 ]);
673673 zval_ptr_dtor (& argv [1 ]);
@@ -715,7 +715,7 @@ static size_t curl_progress(void *clientp, double dltotal, double dlnow, double
715715 php_error_docref (NULL , E_WARNING , "Cannot call the CURLOPT_PROGRESSFUNCTION" );
716716 } else if (!Z_ISUNDEF (retval )) {
717717 _php_curl_verify_handlers (ch , /* reporterror */ true);
718- if (0 != zval_get_long (& retval )) {
718+ if (0 != php_curl_get_long (& retval )) {
719719 rval = 1 ;
720720 }
721721 }
@@ -764,7 +764,7 @@ static size_t curl_xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow,
764764 php_error_docref (NULL , E_WARNING , "Cannot call the CURLOPT_XFERINFOFUNCTION" );
765765 } else if (!Z_ISUNDEF (retval )) {
766766 _php_curl_verify_handlers (ch , /* reporterror */ true);
767- if (0 != zval_get_long (& retval )) {
767+ if (0 != php_curl_get_long (& retval )) {
768768 rval = 1 ;
769769 }
770770 }
@@ -821,6 +821,7 @@ static int curl_ssh_hostkeyfunction(void *clientp, int keytype, const char *key,
821821 }
822822 } else {
823823 zend_throw_error (NULL , "The CURLOPT_SSH_HOSTKEYFUNCTION callback must return either CURLKHMATCH_OK or CURLKHMATCH_MISMATCH" );
824+ zval_ptr_dtor (& retval );
824825 }
825826 }
826827 zval_ptr_dtor (& argv [0 ]);
@@ -938,7 +939,7 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx
938939 length = -1 ;
939940 } else if (!Z_ISUNDEF (retval )) {
940941 _php_curl_verify_handlers (ch , /* reporterror */ true);
941- length = zval_get_long (& retval );
942+ length = php_curl_get_long (& retval );
942943 }
943944 zval_ptr_dtor (& argv [0 ]);
944945 zval_ptr_dtor (& argv [1 ]);
@@ -1290,6 +1291,17 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
12901291 (* source -> clone )++ ;
12911292}
12921293
1294+ zend_long php_curl_get_long (zval * zv )
1295+ {
1296+ if (EXPECTED (Z_TYPE_P (zv ) == IS_LONG )) {
1297+ return Z_LVAL_P (zv );
1298+ } else {
1299+ zend_long ret = zval_get_long (zv );
1300+ zval_ptr_dtor (zv );
1301+ return ret ;
1302+ }
1303+ }
1304+
12931305#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
12941306static size_t read_cb (char * buffer , size_t size , size_t nitems , void * arg ) /* {{{ */
12951307{
0 commit comments