@@ -757,6 +757,54 @@ static size_t curl_xferinfo(void *clientp, curl_off_t dltotal, curl_off_t dlnow,
757
757
/* }}} */
758
758
#endif
759
759
760
+ #if LIBCURL_VERSION_NUM >= 0x075400
761
+ static size_t curl_ssh_hostkeyfunction (void * clientp , int keytype , const char * key , size_t keylen )
762
+ {
763
+ php_curl * ch = (php_curl * )clientp ;
764
+ php_curl_callback * t = ch -> handlers .sshhostkey ;
765
+ size_t rval = 0 ;
766
+
767
+ #if PHP_CURL_DEBUG
768
+ fprintf (stderr , "curl_ssh_hostkeyfunction() called\n" );
769
+ fprintf (stderr , "clientp = %x, keytype = %d, key = %s, keylen = %zu\n" , clientp , keytype , key , keylen );
770
+ #endif
771
+
772
+ zval argv [4 ];
773
+ zval retval ;
774
+ zend_result error ;
775
+ zend_fcall_info fci ;
776
+
777
+ GC_ADDREF (& ch -> std );
778
+ ZVAL_OBJ (& argv [0 ], & ch -> std );
779
+ ZVAL_LONG (& argv [1 ], keytype );
780
+ ZVAL_STRING (& argv [2 ], key );
781
+ ZVAL_LONG (& argv [3 ], keylen );
782
+
783
+ fci .size = sizeof (fci );
784
+ ZVAL_COPY_VALUE (& fci .function_name , & t -> func_name );
785
+ fci .object = NULL ;
786
+ fci .retval = & retval ;
787
+ fci .param_count = 4 ;
788
+ fci .params = argv ;
789
+ fci .named_params = NULL ;
790
+
791
+ ch -> in_callback = 1 ;
792
+ error = zend_call_function (& fci , & t -> fci_cache );
793
+ ch -> in_callback = 0 ;
794
+ if (error == FAILURE ) {
795
+ php_error_docref (NULL , E_WARNING , "Cannot call the CURLOPT_SSH_HOSTKEYFUNCTION" );
796
+ } else if (!Z_ISUNDEF (retval )) {
797
+ _php_curl_verify_handlers (ch , /* reporterror */ true);
798
+ if (0 != zval_get_long (& retval )) {
799
+ rval = 1 ;
800
+ }
801
+ }
802
+ zval_ptr_dtor (& argv [0 ]);
803
+ zval_ptr_dtor (& argv [2 ]);
804
+ return rval ;
805
+ }
806
+ #endif
807
+
760
808
/* {{{ curl_read */
761
809
static size_t curl_read (char * data , size_t size , size_t nmemb , void * ctx )
762
810
{
@@ -1771,6 +1819,16 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
1771
1819
#endif
1772
1820
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
1773
1821
case CURLOPT_MAXLIFETIME_CONN :
1822
+ #endif
1823
+ #if LIBCURL_VERSION_NUM >= 0x075100 /* Available since 7.81.0 */
1824
+ case CURLOPT_MIME_OPTIONS :
1825
+ #endif
1826
+ #if LIBCURL_VERSION_NUM >= 0x075500 /* Available since 7.85.0 */
1827
+ case CURLOPT_WS_OPTIONS :
1828
+ #endif
1829
+ #if LIBCURL_VERSION_NUM >= 0x075700 /* Available since 7.87.0 */
1830
+ case CURLOPT_CA_CACHE_TIMEOUT :
1831
+ case CURLOPT_QUICK_EXIT :
1774
1832
#endif
1775
1833
lval = zval_get_long (zvalue );
1776
1834
if ((option == CURLOPT_PROTOCOLS || option == CURLOPT_REDIR_PROTOCOLS ) &&
@@ -1886,10 +1944,21 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
1886
1944
#endif
1887
1945
#if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
1888
1946
case CURLOPT_SSH_HOST_PUBLIC_KEY_SHA256 :
1947
+ #endif
1948
+ #if LIBCURL_VERSION_NUM >= 0x075500 /* Available since 7.85.0 */
1949
+ case CURLOPT_PROTOCOLS_STR :
1950
+ case CURLOPT_REDIR_PROTOCOLS_STR :
1889
1951
#endif
1890
1952
{
1891
1953
zend_string * tmp_str ;
1892
1954
zend_string * str = zval_get_tmp_string (zvalue , & tmp_str );
1955
+ #if LIBCURL_VERSION_NUM >= 0x075500 /* Available since 7.85.0 */
1956
+ if (option == CURLOPT_PROTOCOLS_STR &&
1957
+ (PG (open_basedir ) && * PG (open_basedir )) && php_memnistr (ZSTR_VAL (str ), "file" , sizeof ("file" ) - 1 , ZSTR_VAL (str ) + ZSTR_LEN (str )) != NULL ) {
1958
+ php_error_docref (NULL , E_WARNING , "The FILE protocol cannot be activated when an open_basedir is set" );
1959
+ return FAILURE ;
1960
+ }
1961
+ #endif
1893
1962
zend_result ret = php_curl_option_str (ch , option , ZSTR_VAL (str ), ZSTR_LEN (str ));
1894
1963
zend_tmp_string_release (tmp_str );
1895
1964
return ret ;
@@ -2184,6 +2253,20 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
2184
2253
ZVAL_COPY (& ch -> handlers .progress -> func_name , zvalue );
2185
2254
break ;
2186
2255
2256
+ #if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
2257
+ case CURLOPT_SSH_HOSTKEYFUNCTION :
2258
+ curl_easy_setopt (ch -> cp , CURLOPT_SSH_HOSTKEYFUNCTION , curl_ssh_hostkeyfunction );
2259
+ curl_easy_setopt (ch -> cp , CURLOPT_SSH_HOSTKEYDATA , ch );
2260
+ if (ch -> handlers .sshhostkey == NULL ) {
2261
+ ch -> handlers .sshhostkey = ecalloc (1 , sizeof (php_curl_callback ));
2262
+ } else if (!Z_ISUNDEF (ch -> handlers .sshhostkey -> func_name )) {
2263
+ zval_ptr_dtor (& ch -> handlers .sshhostkey -> func_name );
2264
+ ch -> handlers .sshhostkey -> fci_cache = empty_fcall_info_cache ;
2265
+ }
2266
+ ZVAL_COPY (& ch -> handlers .sshhostkey -> func_name , zvalue );
2267
+ break ;
2268
+ #endif
2269
+
2187
2270
case CURLOPT_READFUNCTION :
2188
2271
if (!Z_ISUNDEF (ch -> handlers .read -> func_name )) {
2189
2272
zval_ptr_dtor (& ch -> handlers .read -> func_name );
@@ -2640,6 +2723,14 @@ PHP_FUNCTION(curl_getinfo)
2640
2723
if (curl_easy_getinfo (ch -> cp , CURLINFO_EFFECTIVE_METHOD , & s_code ) == CURLE_OK ) {
2641
2724
CAAS ("effective_method" , s_code );
2642
2725
}
2726
+ #endif
2727
+ #if LIBCURL_VERSION_NUM >= 0x075400 /* Available since 7.84.0 */
2728
+ if (curl_easy_getinfo (ch -> cp , CURLINFO_CAPATH , & s_code ) == CURLE_OK ) {
2729
+ CAAS ("capath" , s_code );
2730
+ }
2731
+ if (curl_easy_getinfo (ch -> cp , CURLINFO_CAINFO , & s_code ) == CURLE_OK ) {
2732
+ CAAS ("cainfo" , s_code );
2733
+ }
2643
2734
#endif
2644
2735
} else {
2645
2736
switch (option ) {
@@ -2878,6 +2969,13 @@ static void curl_free_obj(zend_object *object)
2878
2969
efree (ch -> handlers .fnmatch );
2879
2970
}
2880
2971
2972
+ #if LIBCURL_VERSION_NUM >= 0x075400
2973
+ if (ch -> handlers .sshhostkey ) {
2974
+ zval_ptr_dtor (& ch -> handlers .sshhostkey -> func_name );
2975
+ efree (ch -> handlers .sshhostkey );
2976
+ }
2977
+ #endif
2978
+
2881
2979
zval_ptr_dtor (& ch -> postfields );
2882
2980
zval_ptr_dtor (& ch -> private_data );
2883
2981
0 commit comments