From aaf00ae0a99b84f1fb9a053fa08aef2abdab9f2b Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sun, 3 Dec 2017 12:23:25 +0100 Subject: [PATCH] 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. --- ext/curl/interface.c | 11 +++++++++++ 1 file changed, 11 insertions(+) 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); } /* }}} */ -- 2.40.0