summaryrefslogtreecommitdiff
path: root/lib/urlapi.c
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2018-10-01 15:59:24 +0200
committerDaniel Stenberg <daniel@haxx.se>2018-10-02 11:48:01 +0200
commitd9a2dc9aad055c12103f668194790c2beab661e9 (patch)
treeffd72601fb187f0065874832fa1ba32c3cd4273e /lib/urlapi.c
parentc1c092c0b43211d1609188e7a47bd6f7e86c6c0e (diff)
downloadcurl-d9a2dc9aad055c12103f668194790c2beab661e9.tar.gz
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/urlapi.c')
-rw-r--r--lib/urlapi.c32
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);