From 324aeab8c92ada5c271a0196a89c7b2168597192 Mon Sep 17 00:00:00 2001 From: deepend Date: Thu, 26 Feb 2026 11:38:08 -0700 Subject: [PATCH] Fixed the Win32 startup path initialization in fe_args to avoid blindly calling g_path_get_dirname(argv[0]) when argv may be missing/invalid in subsystem:windows launch contexts (like URL handler launches). Updated logic to prefer g_win32_get_package_installation_directory_of_module(NULL) first, and only fall back to argv[0] when argc > 0, argv != NULL, and argv[0] != NULL, preventing null/invalid pointer access during startup. --- src/fe-gtk/fe-gtk.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/fe-gtk/fe-gtk.c b/src/fe-gtk/fe-gtk.c index 3002af8e..f86a903a 100644 --- a/src/fe-gtk/fe-gtk.c +++ b/src/fe-gtk/fe-gtk.c @@ -410,7 +410,12 @@ fe_args (int argc, char *argv[]) /* of the exe. */ { g_free (win32_argv0_dir); - win32_argv0_dir = g_path_get_dirname (argv[0]); + /* In subsystem:windows builds, argv can be absent/invalid depending on + * launch context (e.g. shell URL handlers). Prefer the module path, + * then only fall back to argv[0] when it is available. */ + win32_argv0_dir = g_win32_get_package_installation_directory_of_module (NULL); + if (win32_argv0_dir == NULL && argc > 0 && argv != NULL && argv[0] != NULL) + win32_argv0_dir = g_path_get_dirname (argv[0]); if (win32_argv0_dir) chdir (win32_argv0_dir); }