When enabling security with "mono_security_enable_core_clr" on a Windows machine...
authorNican <nican132@gmail.com>
Wed, 15 Aug 2012 05:31:09 +0000 (01:31 -0400)
committerNican <nican132@gmail.com>
Wed, 15 Aug 2012 05:31:09 +0000 (01:31 -0400)
The loop is happening between these calls:
https://github.com/mono/mono/blob/92d8961e0b244429d4d82176f4b33c8a4b3b064c/mcs/class/corlib/System.IO/Path.cs#L298
https://github.com/mono/mono/blob/3c39ac4586b4470703fb4af0208b5baf1de70e43/mcs/class/corlib/System.Security.Permissions/FileIOPermission.cs#L157
https://github.com/mono/mono/blob/9322e0d16b0edc054947279af34d3c7afb286c89/mcs/class/corlib/System.IO/Directory.cs#L248

Stack trace as follows:

The requested operation caused a stack overflow.  at (wrapper managed-to-native) System.IO.MonoIO:GetCurrentDirectory (System.IO.MonoIOError&)
  at System.IO.Directory.GetCurrentDirectory () [0x00000] in <filename unknown>:0
  at System.IO.Path.WindowsDriveAdjustment (System.String path) [0x00000] in <filename unknown>:0
  at System.IO.Path.InsecureGetFullPath (System.String path) [0x00000] in <filename unknown>:0
  at System.Security.Permissions.FileIOPermission.AddPathInternal (FileIOPermissionAccess access, System.String path) [0x00000] in <filename unknown>:0
  at System.Security.Permissions.FileIOPermission.AddPathList (FileIOPermissionAccess access, System.String path) [0x00000] in <filename unknown>:0
  at System.Security.Permissions.FileIOPermission..ctor (FileIOPermissionAccess access, System.String path) [0x00000] in <filename unknown>:0
  at System.IO.Directory.GetCurrentDirectory () [0x00000] in <filename unknown>:0
  at System.IO.Path.WindowsDriveAdjustment (System.String path) [0x00000] in <filename unknown>:0
  at System.IO.Path.InsecureGetFullPath (System.String path) [0x00000] in <filename unknown>:0
  at System.Security.Permissions.FileIOPermission.AddPathInternal (FileIOPermissionAccess access, System.String path) [0x00000] in <filename unknown>:0
  at System.Security.Permissions.FileIOPermission.AddPathList (FileIOPermissionAccess access, System.String path) [0x00000] in <filename unknown>:0
  at System.Security.Permissions.FileIOPermission..ctor (FileIOPermissionAccess access, System.String path) [0x00000] in <filename unknown>:0
  at System.IO.Directory.GetCurrentDirectory () [0x00000] in <filename unknown>:0
  at System.IO.Path.WindowsDriveAdjustment (System.String path) [0x00000] in <filename unknown>:0
  at System.IO.Path.InsecureGetFullPath (System.String path) [0x00000] in <filename unknown>:0
...Snip...

mcs/class/corlib/System.IO/Directory.cs
mcs/class/corlib/System.IO/Path.cs

index d52d6f62be4750a7e1edb87611b17dac432f270d..1c6e6f6f5ff74b26cc7f8de55eb34e2a4390230a 100644 (file)
@@ -236,13 +236,9 @@ namespace System.IO
 
                public static string GetCurrentDirectory ()
                {
-                       MonoIOError error;
-
                        SecurityManager.EnsureElevatedPermissions (); // this is a no-op outside moonlight
-                               
-                       string result = MonoIO.GetCurrentDirectory (out error);
-                       if (error != MonoIOError.ERROR_SUCCESS)
-                               throw MonoIO.GetException (error);
+
+            string result = InsecureGetCurrentDirectory();
 #if !NET_2_1
                        if ((result != null) && (result.Length > 0) && SecurityManager.SecurityEnabled) {
                                new FileIOPermission (FileIOPermissionAccess.PathDiscovery, result).Demand ();
@@ -250,6 +246,17 @@ namespace System.IO
 #endif
                        return result;
                }
+
+        internal static string InsecureGetCurrentDirectory ()
+        {
+            MonoIOError error;
+            string result = MonoIO.GetCurrentDirectory(out error);
+            
+            if (error != MonoIOError.ERROR_SUCCESS)
+                throw MonoIO.GetException(error);
+
+            return result;
+        }
                
                public static string [] GetDirectories (string path)
                {
index 5b63ce725058477d59e1003d6c58c52de6bba550..a71ab6adb59d553e5cdecd0918e85741e3c814c9 100644 (file)
@@ -295,7 +295,7 @@ namespace System.IO {
                        if ((path [1] != ':') || !Char.IsLetter (path [0]))
                                return path;
 
-                       string current = Directory.GetCurrentDirectory ();
+            string current = Directory.InsecureGetCurrentDirectory ();
                        // first, only the drive is specified
                        if (path.Length == 2) {
                                // then if the current directory is on the same drive
@@ -357,13 +357,13 @@ namespace System.IO {
                                                }
                                                canonicalize = start > 0;
                                        }
-                                       
-                                       path = Directory.GetCurrentDirectory () + DirectorySeparatorStr + path;
+
+                    path = Directory.InsecureGetCurrentDirectory() + DirectorySeparatorStr + path;
                                } else if (DirectorySeparatorChar == '\\' &&
                                        path.Length >= 2 &&
                                        IsDsc (path [0]) &&
                                        !IsDsc (path [1])) { // like `\abc\def'
-                                       string current = Directory.GetCurrentDirectory ();
+                    string current = Directory.InsecureGetCurrentDirectory();
                                        if (current [1] == VolumeSeparatorChar)
                                                path = current.Substring (0, 2) + path;
                                        else