mirror of
https://github.com/moparisthebest/curl
synced 2024-11-16 06:25:03 -05:00
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
This commit is contained in:
parent
c1c092c0b4
commit
d9a2dc9aad
32
lib/urlapi.c
32
lib/urlapi.c
@ -35,6 +35,20 @@
|
|||||||
#include "curl_memory.h"
|
#include "curl_memory.h"
|
||||||
#include "memdebug.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. */
|
/* Internal representation of CURLU. Point to URL-encoded strings. */
|
||||||
struct Curl_URL {
|
struct Curl_URL {
|
||||||
char *scheme;
|
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)
|
bool Curl_is_absolute_url(const char *url, char *buf, size_t buflen)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
#ifdef WIN32
|
||||||
|
if(STARTS_WITH_DRIVE_PREFIX(url))
|
||||||
|
return FALSE;
|
||||||
|
#endif
|
||||||
for(i = 0; i < buflen && url[i]; ++i) {
|
for(i = 0; i < buflen && url[i]; ++i) {
|
||||||
char s = url[i];
|
char s = url[i];
|
||||||
if(s == ':') {
|
if(s == ':') {
|
||||||
@ -610,20 +628,6 @@ static CURLUcode seturl(const char *url, CURLU *u, unsigned int flags)
|
|||||||
hostname = &path[urllen + 1];
|
hostname = &path[urllen + 1];
|
||||||
hostname[0] = 0;
|
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))) {
|
if(Curl_is_absolute_url(url, schemebuf, sizeof(schemebuf))) {
|
||||||
url_has_scheme = TRUE;
|
url_has_scheme = TRUE;
|
||||||
schemelen = strlen(schemebuf);
|
schemelen = strlen(schemebuf);
|
||||||
|
Loading…
Reference in New Issue
Block a user