diff options
Diffstat (limited to 'ext/curl/interface.c')
-rw-r--r-- | ext/curl/interface.c | 179 |
1 files changed, 79 insertions, 100 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 5f7783e669..0d96d1f026 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -165,50 +165,58 @@ static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC); # define php_curl_ret(__ret) RETVAL_FALSE; return; #endif -static int php_curl_option_url(php_curl *ch, const char *url, const int len TSRMLS_DC) /* {{{ */ +static int php_curl_option_str(php_curl *ch, long option, const char *str, const int len, zend_bool make_copy TSRMLS_DC) { CURLcode error = CURLE_OK; -#if LIBCURL_VERSION_NUM < 0x071100 - char *copystr = NULL; -#endif + + if (make_copy || LIBCURL_VERSION_NUM < 0x071100) { + char *copystr; + + /* Strings passed to libcurl as 'char *' arguments, are copied by the library since 7.17.0 */ + copystr = estrndup(str, len); + error = curl_easy_setopt(ch->cp, option, copystr); + zend_llist_add_element(&ch->to_free->str, ©str); + } else { + error = curl_easy_setopt(ch->cp, option, str); + } + + SAVE_CURL_ERROR(ch, error) + + return error == CURLE_OK ? SUCCESS : FAILURE; +} + +static int php_curl_option_url(php_curl *ch, const char *url, const int len TSRMLS_DC) /* {{{ */ +{ /* Disable file:// if open_basedir are used */ if (PG(open_basedir) && *PG(open_basedir)) { #if LIBCURL_VERSION_NUM >= 0x071304 - error = curl_easy_setopt(ch->cp, CURLOPT_PROTOCOLS, CURLPROTO_ALL & ~CURLPROTO_FILE); + curl_easy_setopt(ch->cp, CURLOPT_PROTOCOLS, CURLPROTO_ALL & ~CURLPROTO_FILE); #else php_url *uri; if (!(uri = php_url_parse_ex(url, len))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid URL '%s'", url); - return 0; + return FAILURE; } if (uri->scheme && !strncasecmp("file", uri->scheme, sizeof("file"))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Protocol 'file' disabled in cURL"); php_url_free(uri); - return 0; + return FAILURE; } php_url_free(uri); #endif } - /* Strings passed to libcurl as 'char *' arguments, are copied by the library... NOTE: before 7.17.0 strings were not copied. */ -#if LIBCURL_VERSION_NUM >= 0x071100 - error = curl_easy_setopt(ch->cp, CURLOPT_URL, url); -#else - copystr = estrndup(url, len); - error = curl_easy_setopt(ch->cp, CURLOPT_URL, copystr); - zend_llist_add_element(&ch->to_free->str, ©str); -#endif - return (error == CURLE_OK ? 1 : 0); + return php_curl_option_str(ch, CURLOPT_URL, url, len, 0 TSRMLS_CC); } /* }}} */ -int _php_curl_verify_handlers(php_curl *ch, int reporterror TSRMLS_DC) /* {{{ */ +void _php_curl_verify_handlers(php_curl *ch, int reporterror TSRMLS_DC) /* {{{ */ { php_stream *stream; if (!ch || !ch->handlers) { - return 0; + return; } if (ch->handlers->std_err) { @@ -265,7 +273,7 @@ int _php_curl_verify_handlers(php_curl *ch, int reporterror TSRMLS_DC) /* {{{ */ curl_easy_setopt(ch->cp, CURLOPT_FILE, (void *) ch); } } - return 1; + return ; } /* }}} */ @@ -1941,7 +1949,7 @@ PHP_FUNCTION(curl_init) _php_curl_set_default_options(ch); if (url) { - if (!php_curl_option_url(ch, url, url_len TSRMLS_CC)) { + if (php_curl_option_url(ch, url, url_len TSRMLS_CC) == FAILURE) { _php_curl_close_ex(ch TSRMLS_CC); RETURN_FALSE; } @@ -2058,7 +2066,7 @@ PHP_FUNCTION(curl_copy_handle) } /* }}} */ -static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *return_value TSRMLS_DC) /* {{{ */ +static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue TSRMLS_DC) /* {{{ */ { CURLcode error=CURLE_OK; @@ -2225,7 +2233,6 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu if ((option == CURLOPT_PROTOCOLS || option == CURLOPT_REDIR_PROTOCOLS) && (PG(open_basedir) && *PG(open_basedir)) && (Z_LVAL_PP(zvalue) & CURLPROTO_FILE)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "CURLPROTO_FILE cannot be activated when an open_basedir is set"); - RETVAL_FALSE; return 1; } #endif @@ -2240,14 +2247,10 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu case CURLOPT_CAINFO: case CURLOPT_CAPATH: case CURLOPT_COOKIE: - case CURLOPT_CUSTOMREQUEST: case CURLOPT_EGDSOCKET: - case CURLOPT_FTPPORT: case CURLOPT_INTERFACE: - case CURLOPT_PRIVATE: case CURLOPT_PROXY: case CURLOPT_PROXYUSERPWD: - case CURLOPT_RANGE: case CURLOPT_REFERER: case CURLOPT_SSLCERTTYPE: case CURLOPT_SSLENGINE: @@ -2256,23 +2259,14 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu case CURLOPT_SSLKEYPASSWD: case CURLOPT_SSLKEYTYPE: case CURLOPT_SSL_CIPHER_LIST: - case CURLOPT_URL: case CURLOPT_USERAGENT: case CURLOPT_USERPWD: -#if LIBCURL_VERSION_NUM >= 0x070d00 /* Available since 7.13.0 */ - case CURLOPT_FTP_ACCOUNT: -#endif #if LIBCURL_VERSION_NUM >= 0x070e01 /* Available since 7.14.1 */ case CURLOPT_COOKIELIST: #endif #if LIBCURL_VERSION_NUM >= 0x070f05 /* Available since 7.15.5 */ case CURLOPT_FTP_ALTERNATIVE_TO_USER: #endif -#if LIBCURL_VERSION_NUM >= 0x071004 /* Available since 7.16.4 */ - case CURLOPT_KRBLEVEL: -#else - case CURLOPT_KRB4LEVEL: -#endif #if LIBCURL_VERSION_NUM >= 0x071101 /* Available since 7.17.1 */ case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5: #endif @@ -2287,7 +2281,6 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu #endif #if LIBCURL_VERSION_NUM >= 0x071400 /* Available since 7.20.0 */ case CURLOPT_MAIL_FROM: - case CURLOPT_RTSP_SESSION_ID: case CURLOPT_RTSP_STREAM_URI: case CURLOPT_RTSP_TRANSPORT: #endif @@ -2309,32 +2302,44 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu #endif { convert_to_string_ex(zvalue); - if (option == CURLOPT_URL) { - if (!php_curl_option_url(ch, Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue) TSRMLS_CC)) { - RETVAL_FALSE; - return 1; - } - } else { - if (option == CURLOPT_PRIVATE) { - char *copystr; -#if LIBCURL_VERSION_NUM < 0x071100 -string_copy: -#endif - copystr = estrndup(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue)); - error = curl_easy_setopt(ch->cp, option, copystr); - zend_llist_add_element(&ch->to_free->str, ©str); - } else { -#if LIBCURL_VERSION_NUM >= 0x071100 - /* Strings passed to libcurl as ’char *’ arguments, are copied by the library... NOTE: before 7.17.0 strings were not copied. */ - error = curl_easy_setopt(ch->cp, option, Z_STRVAL_PP(zvalue)); + return php_curl_option_str(ch, option, Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue), 0 TSRMLS_CC); + } + + /* Curl nullable string options */ + case CURLOPT_CUSTOMREQUEST: + case CURLOPT_FTPPORT: + case CURLOPT_RANGE: +#if LIBCURL_VERSION_NUM >= 0x070d00 /* Available since 7.13.0 */ + case CURLOPT_FTP_ACCOUNT: +#endif +#if LIBCURL_VERSION_NUM >= 0x071400 /* Available since 7.20.0 */ + case CURLOPT_RTSP_SESSION_ID: +#endif +#if LIBCURL_VERSION_NUM >= 0x071004 /* Available since 7.16.4 */ + case CURLOPT_KRBLEVEL: #else - goto string_copy; + case CURLOPT_KRB4LEVEL: #endif - } + { + if (Z_TYPE_PP(zvalue) == IS_NULL) { + error = curl_easy_setopt(ch->cp, option, NULL); + } else { + convert_to_string_ex(zvalue); + return php_curl_option_str(ch, option, Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue), 0 TSRMLS_CC); } break; } + /* Curl private option */ + case CURLOPT_PRIVATE: + convert_to_string_ex(zvalue); + return php_curl_option_str(ch, option, Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue), 1 TSRMLS_CC); + + /* Curl url option */ + case CURLOPT_URL: + convert_to_string_ex(zvalue); + return php_curl_option_url(ch, Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue) TSRMLS_CC); + /* Curl file handle options */ case CURLOPT_FILE: case CURLOPT_INFILE: @@ -2346,18 +2351,15 @@ string_copy: what = zend_fetch_resource(zvalue TSRMLS_CC, -1, "File-Handle", &type, 1, php_file_le_stream(), php_file_le_pstream()); if (!what) { - RETVAL_FALSE; - return 1; + return FAILURE; } if (FAILURE == php_stream_cast((php_stream *) what, PHP_STREAM_AS_STDIO, (void *) &fp, REPORT_ERRORS)) { - RETVAL_FALSE; - return 1; + return FAILURE; } if (!fp) { - RETVAL_FALSE; - return 1; + return FAILURE; } error = CURLE_OK; @@ -2373,8 +2375,7 @@ string_copy: ch->handlers->write->stream = *zvalue; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "the provided file handle is not writable"); - RETVAL_FALSE; - return 1; + return FAILURE; } break; case CURLOPT_WRITEHEADER: @@ -2388,8 +2389,7 @@ string_copy: ch->handlers->write_header->stream = *zvalue; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "the provided file handle is not writable"); - RETVAL_FALSE; - return 1; + return FAILURE; } break; case CURLOPT_INFILE: @@ -2410,8 +2410,7 @@ string_copy: ch->handlers->std_err = *zvalue; } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "the provided file handle is not writable"); - RETVAL_FALSE; - return 1; + return FAILURE; } /* break omitted intentionally */ default: @@ -2473,8 +2472,7 @@ string_copy: #endif } php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must pass either an object or an array with the %s argument", name); - RETVAL_FALSE; - return 1; + return FAILURE; } for (zend_hash_internal_pointer_reset(ph); @@ -2487,7 +2485,6 @@ string_copy: slist = curl_slist_append(slist, Z_STRVAL_PP(current)); if (!slist) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not build curl_slist"); - RETVAL_FALSE; return 1; } } @@ -2507,8 +2504,7 @@ string_copy: if (PG(open_basedir) && *PG(open_basedir)) { if (Z_LVAL_PP(zvalue) != 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "CURLOPT_FOLLOWLOCATION cannot be activated when an open_basedir is set"); - RETVAL_FALSE; - return 1; + return FAILURE; } } error = curl_easy_setopt(ch->cp, option, Z_LVAL_PP(zvalue)); @@ -2534,8 +2530,7 @@ string_copy: postfields = HASH_OF(*zvalue); if (!postfields) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't get HashTable in CURLOPT_POSTFIELDS"); - RETVAL_FALSE; - return 1; + return FAILURE; } for (zend_hash_internal_pointer_reset(postfields); @@ -2571,7 +2566,6 @@ string_copy: postval = Z_STRVAL_P(prop); if (php_check_open_basedir(postval TSRMLS_CC)) { - RETVAL_FALSE; return 1; } @@ -2620,8 +2614,7 @@ string_copy: } /* open_basedir check */ if (php_check_open_basedir(postval TSRMLS_CC)) { - RETVAL_FALSE; - return 1; + return FAILURE; } error = curl_formadd(&first, &last, CURLFORM_COPYNAME, string_key, @@ -2652,8 +2645,7 @@ string_copy: SAVE_CURL_ERROR(ch, error); if (error != CURLE_OK) { - RETVAL_FALSE; - return 1; + return FAILURE; } if (Z_REFCOUNT_P(ch->clone) <= 1) { @@ -2675,7 +2667,7 @@ string_copy: post = estrndup(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue)); zend_llist_add_element(&ch->to_free->str, &post); - error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDS, post); + curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDS, post); error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDSIZE, Z_STRLEN_PP(zvalue)); #endif } @@ -2773,26 +2765,13 @@ string_copy: case CURLOPT_SSH_KNOWNHOSTS: #endif { -#if LIBCURL_VERSION_NUM < 0x071100 - char *copystr = NULL; -#endif - convert_to_string_ex(zvalue); if (Z_STRLEN_PP(zvalue) && php_check_open_basedir(Z_STRVAL_PP(zvalue) TSRMLS_CC)) { - RETVAL_FALSE; - return 1; + return FAILURE; } -#if LIBCURL_VERSION_NUM >= 0x071100 - error = curl_easy_setopt(ch->cp, option, Z_STRVAL_PP(zvalue)); -#else - copystr = estrndup(Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue)); - - error = curl_easy_setopt(ch->cp, option, copystr); - zend_llist_add_element(&ch->to_free->str, ©str); -#endif - break; + return php_curl_option_str(ch, option, Z_STRVAL_PP(zvalue), Z_STRLEN_PP(zvalue), 0 TSRMLS_CC); } case CURLINFO_HEADER_OUT: @@ -2837,9 +2816,9 @@ string_copy: SAVE_CURL_ERROR(ch, error); if (error != CURLE_OK) { - return 1; + return FAILURE; } else { - return 0; + return SUCCESS; } } /* }}} */ @@ -2863,7 +2842,7 @@ PHP_FUNCTION(curl_setopt) RETURN_FALSE; } - if (!_php_curl_setopt(ch, options, zvalue, return_value TSRMLS_CC)) { + if (_php_curl_setopt(ch, options, zvalue TSRMLS_CC) == SUCCESS) { RETURN_TRUE; } else { RETURN_FALSE; @@ -2894,7 +2873,7 @@ PHP_FUNCTION(curl_setopt_array) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array keys must be CURLOPT constants or equivalent integer values"); RETURN_FALSE; } - if (_php_curl_setopt(ch, (long) option, entry, return_value TSRMLS_CC)) { + if (_php_curl_setopt(ch, (long) option, entry TSRMLS_CC) == FAILURE) { RETURN_FALSE; } zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos); |