From 1cee9dff60158990248c395cc0bfa80e03e4581a Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Fri, 10 Jan 2025 07:20:58 +1000 Subject: [PATCH] Ensure file pickers (via `IDialogParent`) don't choke on bad paths see also #4077 but that's still open while this is clear-cut --- src/BizHawk.Client.EmuHawk/MainForm.cs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index f6e1bd9d22..f9249cb0a1 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -4499,6 +4499,20 @@ namespace BizHawk.Client.EmuHawk public IDialogController DialogController => this; + private static string SanitiseForFileDialog(string initDir) + { + if (Directory.Exists(initDir)) return initDir; +#if DEBUG + throw new ArgumentException( + paramName: nameof(initDir), + message: File.Exists(initDir) + ? $"file picker called with {nameof(initDir)} set to a non-dir" + : $"file picker called with {nameof(initDir)} set to a nonexistent path"); +#else + return File.Exists(initDir) ? Path.GetDirectoryName(initDir) : string.Empty; +#endif + } + public IReadOnlyList/*?*/ ShowFileMultiOpenDialog( IDialogParent dialogParent, string/*?*/ filterStr, @@ -4514,10 +4528,11 @@ namespace BizHawk.Client.EmuHawk FileName = initFileName ?? string.Empty, Filter = filterStr ?? string.Empty, FilterIndex = filterIndex, - InitialDirectory = initDir, + InitialDirectory = SanitiseForFileDialog(initDir), Multiselect = maySelectMultiple, RestoreDirectory = discardCWDChange, Title = windowTitle ?? string.Empty, + ValidateNames = false, // only raises confusing errors, doesn't affect result }; var result = dialogParent.ShowDialogWithTempMute(ofd); filterIndex = ofd.FilterIndex; @@ -4538,9 +4553,10 @@ namespace BizHawk.Client.EmuHawk DefaultExt = fileExt ?? string.Empty, FileName = initFileName ?? string.Empty, Filter = filterStr ?? string.Empty, - InitialDirectory = initDir, + InitialDirectory = SanitiseForFileDialog(initDir), OverwritePrompt = !muteOverwriteWarning, RestoreDirectory = discardCWDChange, + ValidateNames = false, // only raises confusing errors, doesn't affect result }; var result = dialogParent.ShowDialogWithTempMute(sfd); return result.IsOk() ? sfd.FileName : null;