]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
util: file: Don't carelessly sanitize URIs
authorPeter Krempa <pkrempa@redhat.com>
Wed, 8 Apr 2015 08:57:07 +0000 (10:57 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 9 Apr 2015 07:43:36 +0000 (09:43 +0200)
rfc3986 states that the separator in URI path is a single slash.
Multiple slashes may potentially lead to different resources and thus we
should not remove them.

src/util/virfile.c
tests/virfiletest.c

index c528a1c01a06879cc97ff08298f9e3bfc0b7c272..87d121db5e8c05dd5e895587266efb304a04a206 100644 (file)
@@ -2812,12 +2812,18 @@ char *
 virFileSanitizePath(const char *path)
 {
     const char *cur = path;
+    char *uri;
     char *cleanpath;
     int idx = 0;
 
     if (VIR_STRDUP(cleanpath, path) < 0)
         return NULL;
 
+    /* don't sanitize URIs - rfc3986 states that two slashes may lead to a
+     * different resource, thus removing them would possibly change the path */
+    if ((uri = strstr(path, "://")) && strchr(path, '/') > uri)
+        return cleanpath;
+
     /* Need to sanitize:
      * //           -> //
      * ///          -> /
index 826b2b9e50364602e27e745b480ca167b5dbc4d4..628fa1fb0efbcf47f7458e30d8519a413ad8cd9e 100644 (file)
@@ -165,6 +165,8 @@ mymain(void)
             ret = -1;                                                          \
     } while (0)
 
+#define DO_TEST_SANITIZE_PATH_SAME(PATH) DO_TEST_SANITIZE_PATH(PATH, PATH)
+
     virtTestCounterReset("testFileSanitizePath ");
     DO_TEST_SANITIZE_PATH("", "");
     DO_TEST_SANITIZE_PATH("/", "/");
@@ -178,6 +180,11 @@ mymain(void)
     DO_TEST_SANITIZE_PATH("../../", "../..");
     DO_TEST_SANITIZE_PATH("//foo//bar", "//foo/bar");
     DO_TEST_SANITIZE_PATH("/bar//foo", "/bar/foo");
+    DO_TEST_SANITIZE_PATH_SAME("gluster://bar.baz/foo/hoo");
+    DO_TEST_SANITIZE_PATH_SAME("gluster://bar.baz//fooo/hoo");
+    DO_TEST_SANITIZE_PATH_SAME("gluster://bar.baz//////fooo/hoo");
+    DO_TEST_SANITIZE_PATH_SAME("gluster://bar.baz/fooo//hoo");
+    DO_TEST_SANITIZE_PATH_SAME("gluster://bar.baz/fooo///////hoo");
 
     return ret != 0 ? EXIT_FAILURE : EXIT_SUCCESS;
 }