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...
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 ();
#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)
{
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
}
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