]> granicus.if.org Git - php/commitdiff
Fix compat with libcurl 7.56.1+ and file:// wrapper
authorAnatol Belski <ab@php.net>
Sun, 3 Dec 2017 11:23:25 +0000 (12:23 +0100)
committerAnatol Belski <ab@php.net>
Sun, 3 Dec 2017 11:23:25 +0000 (12:23 +0100)
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

index c88bbaef939303643ba4edd5cd0ed9598b02f871..f931efbe0691e9930ef0b749d27d86efbcdac23e 100644 (file)
@@ -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);
 }
 /* }}} */