1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-03-25 10:50:08 +03:00

applied a set of patches from Lorenzo Viali correcting URI parsing errors.

* uri.c: applied a set of patches from Lorenzo Viali correcting
  URI parsing errors.
Daniel
This commit is contained in:
Daniel Veillard 2003-03-23 22:00:51 +00:00
parent 5f8d1a3570
commit 9231ff9250
2 changed files with 59 additions and 65 deletions

View File

@ -1,3 +1,8 @@
Sun Mar 23 22:57:20 CET 2003 Daniel Veillard <daniel@veillard.com>
* uri.c: applied a set of patches from Lorenzo Viali correcting
URI parsing errors.
Sun Mar 23 22:00:14 CET 2003 Daniel Veillard <daniel@veillard.com>
* parser.c: validity status was not passed back when validating in

119
uri.c
View File

@ -272,10 +272,7 @@ xmlSaveUri(xmlURIPtr uri) {
return(NULL);
}
}
if ((IS_UNRESERVED(*(p))) ||
((*(p) == ';')) || ((*(p) == '?')) || ((*(p) == ':')) ||
((*(p) == '@')) || ((*(p) == '&')) || ((*(p) == '=')) ||
((*(p) == '+')) || ((*(p) == '$')) || ((*(p) == ',')))
if (IS_RESERVED(*(p)) || IS_UNRESERVED(*(p)))
ret[len++] = *p++;
else {
int val = *(unsigned char *)p++;
@ -769,7 +766,7 @@ xmlNormalizeURIPath(char *path) {
*/
if (path[0] == '/') {
cur = path;
while ((cur[1] == '.') && (cur[2] == '.')
while ((cur[0] == '/') && (cur[1] == '.') && (cur[2] == '.')
&& ((cur[3] == '/') || (cur[3] == '\0')))
cur += 3;
@ -1094,7 +1091,7 @@ xmlParseURIQuery(xmlURIPtr uri, const char **str)
if (str == NULL)
return (-1);
while (IS_URIC(cur) || ((uri->cleanup) && (IS_UNWISE(cur))))
while (IS_URIC(cur) || ((uri != NULL) && (uri->cleanup) && (IS_UNWISE(cur))))
NEXT(cur);
if (uri != NULL) {
if (uri->query != NULL)
@ -1157,11 +1154,11 @@ xmlParseURIOpaquePart(xmlURIPtr uri, const char **str)
return (-1);
cur = *str;
if (!(IS_URIC_NO_SLASH(cur) || ((uri->cleanup) && (IS_UNWISE(cur))))) {
if (!(IS_URIC_NO_SLASH(cur) || ((uri != NULL) && (uri->cleanup) && (IS_UNWISE(cur))))) {
return (3);
}
NEXT(cur);
while (IS_URIC(cur) || ((uri->cleanup) && (IS_UNWISE(cur))))
while (IS_URIC(cur) || ((uri != NULL) && (uri->cleanup) && (IS_UNWISE(cur))))
NEXT(cur);
if (uri != NULL) {
if (uri->opaque != NULL)
@ -1197,6 +1194,8 @@ static int
xmlParseURIServer(xmlURIPtr uri, const char **str) {
const char *cur;
const char *host, *tmp;
const int IPmax = 4;
int oct;
if (str == NULL)
return(-1);
@ -1239,63 +1238,53 @@ xmlParseURIServer(xmlURIPtr uri, const char **str) {
* or an unresolved name. Check the IP first, it easier to detect
* errors if wrong one
*/
if (IS_DIGIT(*cur)) {
for (oct = 0; oct < IPmax; ++oct) {
if (*cur == '.')
return(3); /* e.g. http://.xml/ or http://18.29..30/ */
while(IS_DIGIT(*cur)) cur++;
if (*cur != '.')
goto host_name;
cur++;
if (!IS_DIGIT(*cur))
goto host_name;
while(IS_DIGIT(*cur)) cur++;
if (*cur != '.')
goto host_name;
cur++;
if (!IS_DIGIT(*cur))
goto host_name;
while(IS_DIGIT(*cur)) cur++;
if (*cur != '.')
goto host_name;
cur++;
if (!IS_DIGIT(*cur))
goto host_name;
while(IS_DIGIT(*cur)) cur++;
if (uri != NULL) {
if (uri->authority != NULL) xmlFree(uri->authority);
uri->authority = NULL;
if (uri->server != NULL) xmlFree(uri->server);
uri->server = xmlURIUnescapeString(host, cur - host, NULL);
}
goto host_done;
if (oct == (IPmax-1))
continue;
if (*cur != '.')
break;
cur++;
}
host_name:
/*
* the hostname production as-is is a parser nightmare.
* simplify it to
* hostname = *( domainlabel "." ) domainlabel [ "." ]
* and just make sure the last label starts with a non numeric char.
*/
if (!IS_ALPHANUM(*cur))
return(6);
while (IS_ALPHANUM(*cur)) {
while ((IS_ALPHANUM(*cur)) || (*cur == '-')) cur++;
if (*cur == '.')
cur++;
if (oct < IPmax || (*cur == '.' && cur++) || IS_ALPHA(*cur)) {
/* maybe host_name */
if (!IS_ALPHANUM(*cur))
return(4); /* e.g. http://xml.$oft */
do {
do ++cur; while (IS_ALPHANUM(*cur));
if (*cur == '-') {
--cur;
if (*cur == '.')
return(5); /* e.g. http://xml.-soft */
++cur;
continue;
}
if (*cur == '.') {
--cur;
if (*cur == '-')
return(6); /* e.g. http://xml-.soft */
if (*cur == '.')
return(7); /* e.g. http://xml..soft */
++cur;
continue;
}
break;
} while (1);
tmp = cur;
if (tmp[-1] == '.')
--tmp; /* e.g. http://xml.$Oft/ */
do --tmp; while (tmp >= host && IS_ALPHANUM(*tmp));
if ((++tmp == host || tmp[-1] == '.') && !IS_ALPHA(*tmp))
return(8); /* e.g. http://xmlsOft.0rg/ */
}
tmp = cur;
tmp--;
while (IS_ALPHANUM(*tmp) && (*tmp != '.') && (tmp >= host)) tmp--;
tmp++;
if (!IS_ALPHA(*tmp))
return(7);
if (uri != NULL) {
if (uri->authority != NULL) xmlFree(uri->authority);
uri->authority = NULL;
if (uri->server != NULL) xmlFree(uri->server);
uri->server = xmlURIUnescapeString(host, cur - host, NULL);
}
host_done:
/*
* finish by checking for a port presence.
*/
@ -1336,11 +1325,11 @@ xmlParseURIRelSegment(xmlURIPtr uri, const char **str)
return (-1);
cur = *str;
if (!(IS_SEGMENT(cur) || ((uri->cleanup) && (IS_UNWISE(cur))))) {
if (!(IS_SEGMENT(cur) || ((uri != NULL) && (uri->cleanup) && (IS_UNWISE(cur))))) {
return (3);
}
NEXT(cur);
while (IS_SEGMENT(cur) || ((uri->cleanup) && (IS_UNWISE(cur))))
while (IS_SEGMENT(cur) || ((uri != NULL) && (uri->cleanup) && (IS_UNWISE(cur))))
NEXT(cur);
if (uri != NULL) {
if (uri->path != NULL)
@ -1376,11 +1365,11 @@ xmlParseURIPathSegments(xmlURIPtr uri, const char **str, int slash)
cur = *str;
do {
while (IS_PCHAR(cur) || ((uri->cleanup) && (IS_UNWISE(cur))))
while (IS_PCHAR(cur) || ((uri != NULL) && (uri->cleanup) && (IS_UNWISE(cur))))
NEXT(cur);
while (*cur == ';') {
cur++;
while (IS_PCHAR(cur) || ((uri->cleanup) && (IS_UNWISE(cur))))
while (IS_PCHAR(cur) || ((uri != NULL) && (uri->cleanup) && (IS_UNWISE(cur))))
NEXT(cur);
}
if (*cur != '/')
@ -1825,11 +1814,6 @@ xmlBuildURI(const xmlChar *URI, const xmlChar *base) {
res->fragment = xmlMemStrdup(ref->fragment);
goto step_7;
}
if (ref->query != NULL)
res->query = xmlMemStrdup(ref->query);
if (ref->fragment != NULL)
res->fragment = xmlMemStrdup(ref->fragment);
/*
* 3) If the scheme component is defined, indicating that the reference
@ -1843,6 +1827,11 @@ xmlBuildURI(const xmlChar *URI, const xmlChar *base) {
}
if (bas->scheme != NULL)
res->scheme = xmlMemStrdup(bas->scheme);
if (ref->query != NULL)
res->query = xmlMemStrdup(ref->query);
if (ref->fragment != NULL)
res->fragment = xmlMemStrdup(ref->fragment);
/*
* 4) If the authority component is defined, then the reference is a