diff --git a/src/Xamarin.Android.Tools.AndroidSdk/ProcessUtils.cs b/src/Xamarin.Android.Tools.AndroidSdk/ProcessUtils.cs index d002730..00074a7 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/ProcessUtils.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/ProcessUtils.cs @@ -173,8 +173,15 @@ internal static IEnumerable FindExecutablesInPath (string executable) internal static IEnumerable FindExecutablesInDirectory (string dir, string executable) { + if (!Directory.Exists (dir)) + yield break; foreach (var exe in ExecutableFiles (executable)) { - var exePath = Path.Combine (dir, exe); + string exePath; + try { + exePath = Path.Combine (dir, exe); + } catch (ArgumentException) { + continue; + } if (File.Exists (exePath)) yield return exePath; } diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs index cd6c984..6aa64b8 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkBase.cs @@ -292,9 +292,14 @@ static string GetExecutablePath (string? dir, string exe) if (string.IsNullOrEmpty (dir)) return exe; - foreach (var e in ProcessUtils.ExecutableFiles (exe)) - if (File.Exists (Path.Combine (dir, e))) - return e; + foreach (var e in ProcessUtils.ExecutableFiles (exe)) { + try { + if (File.Exists (Path.Combine (dir, e))) + return e; + } catch (ArgumentException) { + continue; + } + } return exe; } } diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs index 54dc353..d195092 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs @@ -146,6 +146,50 @@ public void Ndk_PathInSdk() } } + [Test] + public void Ndk_Path_InvalidChars () + { + CreateSdks (out string root, out string jdk, out string ndk, out string sdk); + + Action logger = (level, message) => { + Console.WriteLine ($"[{level}] {message}"); + if (level == TraceLevel.Error) + Assert.Fail (message); + }; + + var oldPath = Environment.GetEnvironmentVariable ("PATH"); + try { + Environment.SetEnvironmentVariable ("PATH", "\"C:\\IHAVEQUOTES\\\""); + // Check that this doesn't throw + new AndroidSdkInfo (logger, androidSdkPath: sdk, androidNdkPath: null, javaSdkPath: jdk); + } finally { + Environment.SetEnvironmentVariable ("PATH", oldPath); + Directory.Delete (root, recursive: true); + } + } + + [Test] + public void Ndk_PathExt_InvalidChars () + { + CreateSdks (out string root, out string jdk, out string ndk, out string sdk); + + Action logger = (level, message) => { + Console.WriteLine ($"[{level}] {message}"); + if (level == TraceLevel.Error) + Assert.Fail (message); + }; + + var oldPathExt = Environment.GetEnvironmentVariable ("PATHEXT"); + try { + Environment.SetEnvironmentVariable ("PATHEXT", string.Join (Path.PathSeparator.ToString (), "\"", ".EXE", ".BAT")); + // Check that this doesn't throw + new AndroidSdkInfo (logger, androidSdkPath: sdk, androidNdkPath: null, javaSdkPath: jdk); + } finally { + Environment.SetEnvironmentVariable ("PATHEXT", oldPathExt); + Directory.Delete (root, recursive: true); + } + } + [Test] public void Ndk_AndroidSdkDoesNotExist () {