From 7f4ffdb1e563280a304a7697c8c27a20243e438a Mon Sep 17 00:00:00 2001 From: deepend Date: Sun, 15 Feb 2026 16:15:25 -0700 Subject: [PATCH] =?UTF-8?q?Added=20defensive=20path=20validation=20in=20gt?= =?UTF-8?q?kutil=5Ffile=5Freq()=20so=20the=20file=20chooser=20only=20recei?= =?UTF-8?q?ves=20existing=20directories=20for=20initial/current=20folder?= =?UTF-8?q?=20setup,=20with=20fallback=20to=20get=5Fxdir()=20when=20the=20?= =?UTF-8?q?requested=20folder=20is=20invalid.=20This=20is=20aimed=20at=20p?= =?UTF-8?q?reventing=20the=20Windows=20crash=20that=20occurs=20immediately?= =?UTF-8?q?=20on=20pressing=20the=20Plugin=20GUI=20Load=20button=20(before?= =?UTF-8?q?=20file=20selection).=20Wrapped=20shortcut-folder=20setup=20wit?= =?UTF-8?q?h=20existence=20checks=20and=20explicit=20GError=20handling=20s?= =?UTF-8?q?o=20invalid=20config=20paths=20don=E2=80=99t=20propagate=20into?= =?UTF-8?q?=20GTK=20chooser=20failures/crashes=20on=20Windows.=20Removed?= =?UTF-8?q?=20an=20unused=20get=5Fxdir=5Ffs=20extern=20declaration=20from?= =?UTF-8?q?=20this=20function=20while=20introducing=20a=20single=20xdir=20?= =?UTF-8?q?value=20reused=20across=20chooser=20setup=20logic.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/fe-gtk/gtkutil.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/fe-gtk/gtkutil.c b/src/fe-gtk/gtkutil.c index 39660ed2..4acaf817 100644 --- a/src/fe-gtk/gtkutil.c +++ b/src/fe-gtk/gtkutil.c @@ -493,9 +493,9 @@ gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *us struct file_req *freq; GtkWidget *dialog; GtkFileFilter *filefilter; - extern char *get_xdir_fs (void); char *token; char *tokenbuffer; + const char *xdir; if (flags & FRF_WRITE) { @@ -531,20 +531,33 @@ gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *us NULL); #endif + xdir = get_xdir (); + if (filter && filter[0] && (flags & FRF_FILTERISINITIAL)) { if (flags & FRF_WRITE) { char temp[1024]; path_part (filter, temp, sizeof (temp)); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), temp); + if (temp[0] && g_file_test (temp, G_FILE_TEST_IS_DIR)) + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), temp); + else if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR)) + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), xdir); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), file_part (filter)); } else - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), filter); + { + if (g_file_test (filter, G_FILE_TEST_IS_DIR)) + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), filter); + else if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR)) + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), xdir); + } } else if (!(flags & FRF_RECENTLYUSED)) - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), get_xdir ()); + { + if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR)) + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), xdir); + } if (flags & FRF_MULTIPLE) gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); @@ -570,7 +583,14 @@ gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *us gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filefilter); } - gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (dialog), get_xdir (), NULL); + if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR)) + { + GError *shortcut_error = NULL; + + gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (dialog), xdir, &shortcut_error); + if (shortcut_error) + g_error_free (shortcut_error); + } freq = g_new (struct file_req, 1); freq->dialog = dialog;