Fix mono_path_canonicalize to not canonicalize the root directory to an empty string
authorRolf Bjarne Kvinge <rolf@xamarin.com>
Fri, 30 Mar 2012 11:53:53 +0000 (13:53 +0200)
committerRolf Bjarne Kvinge <rolf@xamarin.com>
Fri, 30 Mar 2012 22:13:39 +0000 (00:13 +0200)
mono/tests/Makefile.am
mono/tests/mono-path.cs [new file with mode: 0644]
mono/utils/mono-path.c

index 97ef3f5ff8a7c0817947fba206315a88328af372..971cb1681255a2bfaf276d63fea39f1a1805c60b 100644 (file)
@@ -379,6 +379,7 @@ BASE_TEST_CS_SRC=           \
        bug-696593.cs   \
        bug-705140.cs   \
        bug-1147.cs     \
+       mono-path.cs    \
        bug-bxc-795.cs
 
 TEST_CS_SRC_DIST=      \
diff --git a/mono/tests/mono-path.cs b/mono/tests/mono-path.cs
new file mode 100644 (file)
index 0000000..8f60e11
--- /dev/null
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+public class Program
+{
+       static bool failure;
+
+       [DllImport ("__Internal")]
+       static extern string mono_path_canonicalize (string input);
+
+       static void CanonicalizeAssert (string input, string expected)
+       {
+               string actual = mono_path_canonicalize (input);
+               if (expected != actual) {
+                       failure = true;
+                       Console.WriteLine ("ERROR: Expected canonicalization of '{0}' to be '{1}', but it was '{2}'.", input, expected, actual);
+               } else {
+                       Console.WriteLine ("SUCCESS: Canonicalization of '{0}' => '{1}'", input, actual);
+               }
+       }
+       
+       static void CanonicalizeTest ()
+       {
+               bool isWindows = !(((int)Environment.OSVersion.Platform == 4) || ((int)Environment.OSVersion.Platform == 128));
+
+               if (!isWindows) {
+                       CanonicalizeAssert ("", Environment.CurrentDirectory);
+                       CanonicalizeAssert ("/", "/");
+                       CanonicalizeAssert ("/..", "/");
+                       CanonicalizeAssert ("/foo", "/foo");
+                       CanonicalizeAssert ("/foo/././", "/foo");
+                       CanonicalizeAssert ("/../../foo", "/foo");
+                       CanonicalizeAssert ("/foo/", "/foo");
+                       CanonicalizeAssert ("/foo/../../../", "/");
+                       CanonicalizeAssert ("/foo/../../..", "/");
+               }
+       }
+       
+       public static int Main()
+       {
+               CanonicalizeTest ();
+               return failure ? 1 : 0;
+       }
+}
\ No newline at end of file
index e04c3dfe8b9f46519816c61b90b9a835e9f2c44d..88b5d25a71904ff89e0923b1b7f967034f0b3c34 100644 (file)
@@ -33,6 +33,8 @@
 
 /* For Native Client, the above is not true.  Since there is no getcwd we fill */
 /* in the file being passed in relative to '.' and don't resolve it            */
+
+/* There are a couple of tests for this method in mono/test/mono-path.cs */
 gchar *
 mono_path_canonicalize (const char *path)
 {
@@ -90,7 +92,20 @@ mono_path_canonicalize (const char *path)
 #endif
        
        if (dest != lastpos) strcpy (dest, lastpos);
-       return g_strreverse (abspath);
+       
+       g_strreverse (abspath);
+
+       /* We strip away all trailing dir separators. This is not correct for the root directory,
+        * since we'll return an empty string, so re-append a dir separator if there is none in the
+        * result */
+       if (strchr (abspath, G_DIR_SEPARATOR) == NULL) {
+               int len = strlen (abspath);
+               abspath = g_realloc (abspath, len + 2);
+               abspath [len] = G_DIR_SEPARATOR;
+               abspath [len+1] = 0;
+       }
+
+       return abspath;
 }
 
 /*