summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2017-12-03 12:23:25 +0100
committerAnatol Belski <ab@php.net>2017-12-03 12:23:25 +0100
commitaaf00ae0a99b84f1fb9a053fa08aef2abdab9f2b (patch)
tree26ca671fd7d99f18406e29fb0861a76280fadcdf
parentcbe60003f12b2b0ef43a96405c0c47a180cd2619 (diff)
downloadphp-git-aaf00ae0a99b84f1fb9a053fa08aef2abdab9f2b.tar.gz
Fix compat with libcurl 7.56.1+ and file:// wrapper
Since 7.52.x libcurl file:// scheme was implemented in a way described in https://tools.ietf.org/html/draft-ietf-appsawg-file-scheme-16 . The draft is still not accepted and the change contained a BC breach with win32 path handling. It was reported upstream and 7.52.x fixed it, but the BC breaching behavior was reintroduced in 7.56.1. Thus, it is better to handle this on the PHP side.
-rw-r--r--ext/curl/interface.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index c88bbaef93..f931efbe06 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -219,6 +219,17 @@ static int php_curl_option_url(php_curl *ch, const char *url, const size_t len)
#endif
}
+#if LIBCURL_VERSION_NUM > 0x073800 && defined(PHP_WIN32)
+ if (len > sizeof("file://") - 1 && '/' != url[sizeof("file://") - 1] && !strncmp("file://", url, sizeof("file://") - 1) && len < MAXPATHLEN - 2) {
+ char _tmp[MAXPATHLEN] = {0};
+
+ memmove(_tmp, "file:///", sizeof("file:///") - 1);
+ memmove(_tmp + sizeof("file:///") - 1, url + sizeof("file://") - 1, len - sizeof("file://") + 1);
+
+ return php_curl_option_str(ch, CURLOPT_URL, _tmp, len + 1, 0);
+ }
+#endif
+
return php_curl_option_str(ch, CURLOPT_URL, url, len, 0);
}
/* }}} */