Bump to libxml2 2.9.7
[platform/upstream/libxml2.git] / uri.c
diff --git a/uri.c b/uri.c
index 4ab0ce2..84e420a 100644 (file)
--- a/uri.c
+++ b/uri.c
@@ -314,7 +314,7 @@ xmlParse3986Query(xmlURIPtr uri, const char **str)
  * @uri:  pointer to an URI structure
  * @str:  the string to analyze
  *
- * Parse a port  part and fills in the appropriate fields
+ * Parse a port part and fills in the appropriate fields
  * of the @uri structure
  *
  * port          = *DIGIT
@@ -325,15 +325,16 @@ static int
 xmlParse3986Port(xmlURIPtr uri, const char **str)
 {
     const char *cur = *str;
+    unsigned port = 0; /* unsigned for defined overflow behavior */
 
     if (ISA_DIGIT(cur)) {
-       if (uri != NULL)
-           uri->port = 0;
        while (ISA_DIGIT(cur)) {
-           if (uri != NULL)
-               uri->port = uri->port * 10 + (*cur - '0');
+           port = port * 10 + (*cur - '0');
+
            cur++;
        }
+       if (uri != NULL)
+           uri->port = port & INT_MAX; /* port value modulo INT_MAX+1 */
        *str = cur;
        return(0);
     }
@@ -759,6 +760,8 @@ xmlParse3986HierPart(xmlURIPtr uri, const char **str)
         cur += 2;
        ret = xmlParse3986Authority(uri, &cur);
        if (ret != 0) return(ret);
+       if (uri->server == NULL)
+           uri->port = -1;
        ret = xmlParse3986PathAbEmpty(uri, &cur);
        if (ret != 0) return(ret);
        *str = cur;
@@ -1106,7 +1109,7 @@ xmlSaveUri(xmlURIPtr uri) {
            }
        }
     } else {
-       if (uri->server != NULL) {
+       if ((uri->server != NULL) || (uri->port == -1)) {
            if (len + 3 >= max) {
                 temp = xmlSaveUriRealloc(ret, &max);
                 if (temp == NULL) goto mem_error;
@@ -1143,22 +1146,24 @@ xmlSaveUri(xmlURIPtr uri) {
                }
                ret[len++] = '@';
            }
-           p = uri->server;
-           while (*p != 0) {
-               if (len >= max) {
-                    temp = xmlSaveUriRealloc(ret, &max);
-                    if (temp == NULL) goto mem_error;
-                    ret = temp;
+           if (uri->server != NULL) {
+               p = uri->server;
+               while (*p != 0) {
+                   if (len >= max) {
+                       temp = xmlSaveUriRealloc(ret, &max);
+                       if (temp == NULL) goto mem_error;
+                       ret = temp;
+                   }
+                   ret[len++] = *p++;
                }
-               ret[len++] = *p++;
-           }
-           if (uri->port > 0) {
-               if (len + 10 >= max) {
-                    temp = xmlSaveUriRealloc(ret, &max);
-                    if (temp == NULL) goto mem_error;
-                    ret = temp;
+               if (uri->port > 0) {
+                   if (len + 10 >= max) {
+                       temp = xmlSaveUriRealloc(ret, &max);
+                       if (temp == NULL) goto mem_error;
+                       ret = temp;
+                   }
+                   len += snprintf((char *) &ret[len], max - len, ":%d", uri->port);
                }
-               len += snprintf((char *) &ret[len], max - len, ":%d", uri->port);
            }
        } else if (uri->authority != NULL) {
            if (len + 3 >= max) {
@@ -1194,8 +1199,6 @@ xmlSaveUri(xmlURIPtr uri) {
                 if (temp == NULL) goto mem_error;
                 ret = temp;
            }
-           ret[len++] = '/';
-           ret[len++] = '/';
        }
        if (uri->path != NULL) {
            p = uri->path;
@@ -1958,8 +1961,9 @@ xmlBuildURI(const xmlChar *URI, const xmlChar *base) {
            res->scheme = xmlMemStrdup(bas->scheme);
        if (bas->authority != NULL)
            res->authority = xmlMemStrdup(bas->authority);
-       else if (bas->server != NULL) {
-           res->server = xmlMemStrdup(bas->server);
+       else if ((bas->server != NULL) || (bas->port == -1)) {
+           if (bas->server != NULL)
+               res->server = xmlMemStrdup(bas->server);
            if (bas->user != NULL)
                res->user = xmlMemStrdup(bas->user);
            res->port = bas->port;
@@ -2021,8 +2025,9 @@ xmlBuildURI(const xmlChar *URI, const xmlChar *base) {
     }
     if (bas->authority != NULL)
        res->authority = xmlMemStrdup(bas->authority);
-    else if (bas->server != NULL) {
-       res->server = xmlMemStrdup(bas->server);
+    else if ((bas->server != NULL) || (bas->port == -1)) {
+       if (bas->server != NULL)
+           res->server = xmlMemStrdup(bas->server);
        if (bas->user != NULL)
            res->user = xmlMemStrdup(bas->user);
        res->port = bas->port;
@@ -2160,7 +2165,6 @@ xmlBuildRelativeURI (const xmlChar * URI, const xmlChar * base)
     xmlChar *val = NULL;
     int ret;
     int ix;
-    int pos = 0;
     int nbslash = 0;
     int len;
     xmlURIPtr ref = NULL;
@@ -2251,19 +2255,22 @@ xmlBuildRelativeURI (const xmlChar * URI, const xmlChar * base)
        uptr = NULL;
        len = 1;        /* this is for a string terminator only */
     } else {
-    /*
-     * Next we compare the two strings and find where they first differ
-     */
-       if ((ref->path[pos] == '.') && (ref->path[pos+1] == '/'))
-            pos += 2;
+        xmlChar *rptr = (xmlChar *) ref->path;
+        int pos = 0;
+
+        /*
+         * Next we compare the two strings and find where they first differ
+         */
+       if ((*rptr == '.') && (rptr[1] == '/'))
+            rptr += 2;
        if ((*bptr == '.') && (bptr[1] == '/'))
             bptr += 2;
-       else if ((*bptr == '/') && (ref->path[pos] != '/'))
+       else if ((*bptr == '/') && (*rptr != '/'))
            bptr++;
-       while ((bptr[pos] == ref->path[pos]) && (bptr[pos] != 0))
+       while ((bptr[pos] == rptr[pos]) && (bptr[pos] != 0))
            pos++;
 
-       if (bptr[pos] == ref->path[pos]) {
+       if (bptr[pos] == rptr[pos]) {
            val = xmlStrdup(BAD_CAST "");
            goto done;          /* (I can't imagine why anyone would do this) */
        }
@@ -2273,25 +2280,25 @@ xmlBuildRelativeURI (const xmlChar * URI, const xmlChar * base)
         * beginning of the "unique" suffix of URI
         */
        ix = pos;
-       if ((ref->path[ix] == '/') && (ix > 0))
+       if ((rptr[ix] == '/') && (ix > 0))
            ix--;
-       else if ((ref->path[ix] == 0) && (ix > 1) && (ref->path[ix - 1] == '/'))
+       else if ((rptr[ix] == 0) && (ix > 1) && (rptr[ix - 1] == '/'))
            ix -= 2;
        for (; ix > 0; ix--) {
-           if (ref->path[ix] == '/')
+           if (rptr[ix] == '/')
                break;
        }
        if (ix == 0) {
-           uptr = (xmlChar *)ref->path;
+           uptr = (xmlChar *)rptr;
        } else {
            ix++;
-           uptr = (xmlChar *)&ref->path[ix];
+           uptr = (xmlChar *)&rptr[ix];
        }
 
        /*
         * In base, count the number of '/' from the differing point
         */
-       if (bptr[pos] != ref->path[pos]) {/* check for trivial URI == base */
+       if (bptr[pos] != rptr[pos]) {/* check for trivial URI == base */
            for (; bptr[ix] != 0; ix++) {
                if (bptr[ix] == '/')
                    nbslash++;
@@ -2387,8 +2394,7 @@ xmlCanonicPath(const xmlChar *path)
  */
 #if defined(_WIN32) && !defined(__CYGWIN__)
     int len = 0;
-    int i = 0;
-    xmlChar *p = NULL;
+    char *p = NULL;
 #endif
     xmlURIPtr uri;
     xmlChar *ret;
@@ -2452,6 +2458,7 @@ xmlCanonicPath(const xmlChar *path)
                xmlFreeURI(uri);
                return escURI;
            }
+            xmlFree(escURI);
        }
     }
 
@@ -2469,7 +2476,7 @@ path_processing:
     len = xmlStrlen(path);
     if ((len > 2) && IS_WINDOWS_PATH(path)) {
         /* make the scheme 'file' */
-       uri->scheme = xmlStrdup(BAD_CAST "file");
+       uri->scheme = (char *) xmlStrdup(BAD_CAST "file");
        /* allocate space for leading '/' + path + string terminator */
        uri->path = xmlMallocAtomic(len + 2);
        if (uri->path == NULL) {
@@ -2479,9 +2486,9 @@ path_processing:
        /* Put in leading '/' plus path */
        uri->path[0] = '/';
        p = uri->path + 1;
-       strncpy(p, path, len + 1);
+       strncpy(p, (char *) path, len + 1);
     } else {
-       uri->path = xmlStrdup(path);
+       uri->path = (char *) xmlStrdup(path);
        if (uri->path == NULL) {
            xmlFreeURI(uri);
            return(NULL);