Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

2009-11-12 Geoff Norton <gnorton@novell.com>

	* mono-path.c: When resolving symlinks in a path, we need to
	split on the directory separator and check each level, as
	readlink only checks the final destination.

svn path=/trunk/mono/; revision=146071
  • Loading branch information...
commit ae4f24258c51fddeef8705e116c744debadab10d 1 parent 35595b0
Geoff Norton authored
Showing with 42 additions and 5 deletions.
  1. +6 −0 mono/utils/ChangeLog
  2. +36 −5 mono/utils/mono-path.c
View
6 mono/utils/ChangeLog
@@ -1,3 +1,9 @@
+2009-11-12 Geoff Norton <gnorton@novell.com>
+
+ * mono-path.c: When resolving symlinks in a path, we need to
+ split on the directory separator and check each level, as
+ readlink only checks the final destination.
+
2009-11-08 Rodrigo Kumpera <rkumpera@novell.com>
* mono-sigcontext.h: Add ucontext support for FreeBSD/ppc64.
View
41 mono/utils/mono-path.c
@@ -86,12 +86,10 @@ mono_path_canonicalize (const char *path)
* This ensures that the path that we store points to the final file
* not a path to a symlink.
*/
-gchar *
-mono_path_resolve_symlinks (const char *path)
+#if !defined(PLATFORM_NO_SYMLINKS)
+static gchar *
+resolve_symlink (const char *path)
{
-#if defined(PLATFORM_NO_SYMLINKS)
- return mono_path_canonicalize (path);
-#else
char *p, *concat, *dir;
char buffer [PATH_MAX+1];
int n, iterations = 0;
@@ -121,6 +119,39 @@ mono_path_resolve_symlinks (const char *path)
} while (iterations < MAXSYMLINKS);
return p;
+}
+#endif
+
+gchar *
+mono_path_resolve_symlinks (const char *path)
+{
+#if defined(PLATFORM_NO_SYMLINKS)
+ return mono_path_canonicalize (path);
+#else
+ gchar **split = g_strsplit (path, G_DIR_SEPARATOR_S, -1);
+ gchar *p = g_strdup_printf ("");
+ int i;
+
+ for (i = 0; split [i] != NULL; i++) {
+ gchar *tmp = NULL;
+
+ // resolve_symlink of "" goes into canonicalize which resolves to cwd
+ if (strcmp (split [i], "") != 0) {
+ tmp = g_strdup_printf ("%s%s", p, split [i]);
+ g_free (p);
+ p = resolve_symlink (tmp);
+ g_free (tmp);
+ }
+
+ if (split [i+1] != NULL) {
+ tmp = g_strdup_printf ("%s%s", p, G_DIR_SEPARATOR_S);
+ g_free (p);
+ p = tmp;
+ }
+ }
+
+ g_free (split);
+ return p;
#endif
}
Please sign in to comment.
Something went wrong with that request. Please try again.