diff options
author | Daniel Stenberg <daniel@haxx.se> | 2018-10-01 15:59:24 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2018-10-02 11:48:01 +0200 |
commit | d9a2dc9aad055c12103f668194790c2beab661e9 (patch) | |
tree | ffd72601fb187f0065874832fa1ba32c3cd4273e /lib | |
parent | c1c092c0b43211d1609188e7a47bd6f7e86c6c0e (diff) |
urlapi: starting with a drive letter on win32 is not an abs url
... and libcurl doesn't support any single-letter URL schemes (if there
even exist any) so it should be fairly risk-free.
Reported-by: Marcel Raad
Fixes #3070
Closes #3071
Diffstat (limited to 'lib')
-rw-r--r-- | lib/urlapi.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/lib/urlapi.c b/lib/urlapi.c index ff58a69cc..c53e52343 100644 --- a/lib/urlapi.c +++ b/lib/urlapi.c @@ -35,6 +35,20 @@ #include "curl_memory.h" #include "memdebug.h" + /* MSDOS/Windows style drive prefix, eg c: in c:foo */ +#define STARTS_WITH_DRIVE_PREFIX(str) \ + ((('a' <= str[0] && str[0] <= 'z') || \ + ('A' <= str[0] && str[0] <= 'Z')) && \ + (str[1] == ':')) + + /* MSDOS/Windows style drive prefix, optionally with + * a '|' instead of ':', followed by a slash or NUL */ +#define STARTS_WITH_URL_DRIVE_PREFIX(str) \ + ((('a' <= (str)[0] && (str)[0] <= 'z') || \ + ('A' <= (str)[0] && (str)[0] <= 'Z')) && \ + ((str)[1] == ':' || (str)[1] == '|') && \ + ((str)[2] == '/' || (str)[2] == '\\' || (str)[2] == 0)) + /* Internal representation of CURLU. Point to URL-encoded strings. */ struct Curl_URL { char *scheme; @@ -218,6 +232,10 @@ void Curl_strcpy_url(char *output, const char *url, bool relative) bool Curl_is_absolute_url(const char *url, char *buf, size_t buflen) { size_t i; +#ifdef WIN32 + if(STARTS_WITH_DRIVE_PREFIX(url)) + return FALSE; +#endif for(i = 0; i < buflen && url[i]; ++i) { char s = url[i]; if(s == ':') { @@ -610,20 +628,6 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags) hostname = &path[urllen + 1]; hostname[0] = 0; - /* MSDOS/Windows style drive prefix, eg c: in c:foo */ -#define STARTS_WITH_DRIVE_PREFIX(str) \ - ((('a' <= str[0] && str[0] <= 'z') || \ - ('A' <= str[0] && str[0] <= 'Z')) && \ - (str[1] == ':')) - - /* MSDOS/Windows style drive prefix, optionally with - * a '|' instead of ':', followed by a slash or NUL */ -#define STARTS_WITH_URL_DRIVE_PREFIX(str) \ - ((('a' <= (str)[0] && (str)[0] <= 'z') || \ - ('A' <= (str)[0] && (str)[0] <= 'Z')) && \ - ((str)[1] == ':' || (str)[1] == '|') && \ - ((str)[2] == '/' || (str)[2] == '\\' || (str)[2] == 0)) - if(Curl_is_absolute_url(url, schemebuf, sizeof(schemebuf))) { url_has_scheme = TRUE; schemelen = strlen(schemebuf); |