Permalink
Browse files

Fix mono_path_canonicalize to not canonicalize the root directory to …

…an empty string
  • Loading branch information...
1 parent cb1e1e9 commit acb426be97d8ba52119f654d000a044a0ba792c8 @rolfbjarne rolfbjarne committed Mar 30, 2012
Showing with 64 additions and 1 deletion.
  1. +1 −0 mono/tests/Makefile.am
  2. +47 −0 mono/tests/mono-path.cs
  3. +16 −1 mono/utils/mono-path.c
View
1 mono/tests/Makefile.am
@@ -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= \
View
47 mono/tests/mono-path.cs
@@ -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;
+ }
+}
View
17 mono/utils/mono-path.c
@@ -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;
}
/*

0 comments on commit acb426b

Please sign in to comment.