diff -up xfce4-settings-4.16.0/dialogs/mime-settings/xfce-mime-helper.c.BAK xfce4-settings-4.16.0/dialogs/mime-settings/xfce-mime-helper.c --- xfce4-settings-4.16.0/dialogs/mime-settings/xfce-mime-helper.c.BAK 2022-11-10 14:46:34.496823705 +0800 +++ xfce4-settings-4.16.0/dialogs/mime-settings/xfce-mime-helper.c 2022-11-10 14:51:50.390633576 +0800 @@ -375,7 +375,7 @@ xfce_mime_helper_execute (XfceMimeHelper gint status; gint result; gint pid; - const gchar *real_parameter = parameter; + gchar *real_parameter = NULL; // FIXME: startup-notification @@ -387,23 +387,44 @@ xfce_mime_helper_execute (XfceMimeHelper if (G_UNLIKELY (screen == NULL)) screen = gdk_screen_get_default (); - /* strip the mailto part if needed */ - if (real_parameter != NULL && g_str_has_prefix (real_parameter, "mailto:")) - real_parameter = parameter + 7; + if (parameter != NULL) + { + if (helper->category == XFCE_MIME_HELPER_WEBBROWSER || helper->category == XFCE_MIME_HELPER_FILEMANAGER) + { + /* escape characters which do not belong into an URI/URL */ + real_parameter = g_uri_escape_string (parameter, ":/?#[]@!$&'()*+,;=%", TRUE); + } + else if (g_str_has_prefix (real_parameter, "mailto:")) + { + /* strip the mailto part if needed */ + real_parameter = g_strdup (parameter + 7); + } + else + { + real_parameter = g_strdup (parameter); + } + } /* determine the command set to use */ - if (exo_str_is_flag (real_parameter)) { + if (exo_str_is_flag (real_parameter)) + { commands = helper->commands_with_flag; - } else if (exo_str_is_empty (real_parameter)) { + } + else if (exo_str_is_empty (real_parameter)) + { commands = helper->commands; - } else { + } + else + { commands = helper->commands_with_parameter; } + /* verify that we have atleast one command */ if (G_UNLIKELY (*commands == NULL)) { g_set_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_INVAL, _("No command specified")); + g_free (real_parameter); return FALSE; } @@ -493,6 +514,7 @@ xfce_mime_helper_execute (XfceMimeHelper if (G_UNLIKELY (!succeed)) g_propagate_error (error, err); + g_free (real_parameter); return succeed; }