Canonicalize paths that start with more than two slashes.
authorAlexander Larsson <alexl@redhat.com>
Tue, 22 Jan 2008 09:38:37 +0000 (09:38 +0000)
committerAlexander Larsson <alexl@src.gnome.org>
Tue, 22 Jan 2008 09:38:37 +0000 (09:38 +0000)
2008-01-22  Alexander Larsson  <alexl@redhat.com>

        * glocalfile.c:
        (canonicalize_filename):
Canonicalize paths that start with more than
two slashes.

        * tests/g-file.c:
        (compare_two_files):
        (test_g_file_new_for_path):
Test the above

svn path=/trunk/; revision=6353

gio/ChangeLog
gio/glocalfile.c
gio/tests/g-file.c

index e14c312..1a6537f 100644 (file)
@@ -1,6 +1,18 @@
 2008-01-22  Alexander Larsson  <alexl@redhat.com>
 
         * glocalfile.c:
+        (canonicalize_filename):
+       Canonicalize paths that start with more than
+       two slashes.
+       
+        * tests/g-file.c:
+        (compare_two_files):
+        (test_g_file_new_for_path):
+       Test the above
+
+2008-01-22  Alexander Larsson  <alexl@redhat.com>
+
+        * glocalfile.c:
        Allow UTF-8 in file:// parse names.
        
         * tests/Makefile.am:
index 6cc4f28..ae856b6 100644 (file)
@@ -214,6 +214,7 @@ canonicalize_filename (const char *filename)
 {
   char *canon, *start, *p, *q;
   char *cwd;
+  int i;
   
   if (!g_path_is_absolute (filename))
     {
@@ -226,6 +227,24 @@ canonicalize_filename (const char *filename)
 
   start = (char *)g_path_skip_root (canon);
 
+  /* POSIX allows double slashes at the start to
+   * mean something special (as does windows too).
+   * So, "//" != "/", but more than two slashes
+   * is treated as "/".
+   */
+  i = 0;
+  for (p = start - 1;
+       (p >= canon) &&
+        G_IS_DIR_SEPARATOR (*p);
+       p--)
+    i++;
+  if (i > 2)
+    {
+      i -= 1;
+      start -= i;
+      memmove (start, start+i, strlen (start+i)+1);
+    }
+  
   p = start;
   while (*p != 0)
     {
index 69ab077..01b1f65 100644 (file)
@@ -83,7 +83,7 @@ compare_two_files (const gboolean use_uri, const char *path1, const char *path2)
   GFile *file1 = NULL;
   GFile *file2 = NULL;
   gboolean equal;
-  
+
   if (use_uri)
     {
       file1 = g_file_new_for_uri (path1);
@@ -120,7 +120,8 @@ test_g_file_new_for_path (void)
       {"/", TRUE, 0, "/somedir/../"},
       {"/", FALSE, 0, "/somedir/.../"},
       {"//tmp/dir1", TRUE, 0, "//tmp/dir1"},
-      /*  Should not fail:    {"/tmp/dir1", TRUE, 0, "///tmp/dir1"}, */
+      {"/tmp/dir1", TRUE, 0, "///tmp/dir1"},
+      {"/tmp/dir1", TRUE, 0, "////tmp/dir1"},
       {"/tmp/dir1", TRUE, 0, "/tmp/./dir1"},
       {"/tmp/dir1", TRUE, 0, "/tmp//dir1"},
       {"/tmp/dir1", TRUE, 0, "/tmp///dir1///"},