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:
* // -> //
* /// -> /
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("/", "/");
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;
}