parent
35f2504e24
commit
09f1b48f8e
|
@ -0,0 +1,855 @@
|
|||
From 5e42384cc4499293259a8a37a737014a56de34df Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Fri, 23 Oct 2020 18:20:01 +0200
|
||||
Subject: [PATCH 1/4] tests: Iterate mainloop during launch test
|
||||
|
||||
When launching an application, we wait for the DBus response from
|
||||
systemd before executing the binary. Because of this the main loop needs
|
||||
to be iterated for spawning to completed and the file to be created.
|
||||
|
||||
Without this the test will time out if GLib was able to connect to the
|
||||
session bus.
|
||||
---
|
||||
gio/tests/desktop-app-info.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c
|
||||
index fcc29c579..743230cbb 100644
|
||||
--- a/gio/tests/desktop-app-info.c
|
||||
+++ b/gio/tests/desktop-app-info.c
|
||||
@@ -334,6 +334,7 @@ wait_for_file (const gchar *want_this,
|
||||
*/
|
||||
while (access (want_this, F_OK) != 0)
|
||||
{
|
||||
+ g_main_context_iteration (NULL, FALSE);
|
||||
g_usleep (100000); /* 100ms */
|
||||
g_assert_cmpuint (retries, >, 0);
|
||||
retries--;
|
||||
--
|
||||
2.31.1
|
||||
|
||||
From ba3b85a8fea0151e74de50e841a7f16f9b077a56 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Mon, 27 Jul 2020 22:22:32 +0200
|
||||
Subject: [PATCH 2/4] gdesktopappinfo: Move launched applications into
|
||||
transient scope
|
||||
|
||||
Try to move the spawned executable into its own systemd scope. To avoid
|
||||
possible race conditions and ensure proper accounting, we delay the
|
||||
execution of the real command until after the DBus call to systemd has
|
||||
finished.
|
||||
|
||||
From the two approaches we can take here, this is better in the sense
|
||||
that we have a child that the API consumer can watch. API consumers
|
||||
should not be doing this, however, gnome-session needs to watch children
|
||||
during session startup. Until gnome-session is fixed, we will not be
|
||||
able to change this.
|
||||
|
||||
The alternative approach is to delegate launching itself to systemd by
|
||||
creating a transient .service unit instead. This is cleaner and has e.g.
|
||||
the advantage that systemd will take care of log redirection and similar
|
||||
issues.
|
||||
|
||||
Note that this patch is incomplete. The DBus call is done in a "fire and
|
||||
forget" manner, which is fine in most cases, but means that "gio open"
|
||||
will fail to move the child into the new scope as gio quits before the
|
||||
DBus call finishes.
|
||||
---
|
||||
gio/gdesktopappinfo.c | 264 ++++++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 227 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
|
||||
index 1a4b97918..afdcd42ac 100644
|
||||
--- a/gio/gdesktopappinfo.c
|
||||
+++ b/gio/gdesktopappinfo.c
|
||||
@@ -2730,6 +2730,148 @@ notify_desktop_launch (GDBusConnection *session_bus,
|
||||
|
||||
#define _SPAWN_FLAGS_DEFAULT (G_SPAWN_SEARCH_PATH)
|
||||
|
||||
+#if defined(__linux__) && !defined(__BIONIC__)
|
||||
+typedef struct {
|
||||
+ int pipe[2];
|
||||
+ GSpawnChildSetupFunc user_setup;
|
||||
+ gpointer user_setup_data;
|
||||
+} SpawnWrapperData;
|
||||
+
|
||||
+static void
|
||||
+launch_uris_with_spawn_delay_exec (gpointer user_data)
|
||||
+{
|
||||
+ SpawnWrapperData *data = user_data;
|
||||
+
|
||||
+ /* Clear CLOEXEC again, as that was set due to
|
||||
+ * G_SPAWN_LEAVE_DESCRIPTORS_OPEN not being set. */
|
||||
+ fcntl (data->pipe[0], F_SETFD, 0);
|
||||
+
|
||||
+ /* No need to close read side, we have CLOEXEC set. */
|
||||
+
|
||||
+ if (data->user_setup)
|
||||
+ data->user_setup (data->user_setup_data);
|
||||
+}
|
||||
+
|
||||
+static gchar *
|
||||
+systemd_unit_name_escape (const gchar *in)
|
||||
+{
|
||||
+ /* Adapted from systemd source */
|
||||
+ GString * const str = g_string_sized_new (strlen (in));
|
||||
+
|
||||
+ for (; *in; in++)
|
||||
+ {
|
||||
+ if (g_ascii_isalnum (*in) || *in == ':' || *in == '_' || *in == '.')
|
||||
+ g_string_append_c (str, *in);
|
||||
+ else
|
||||
+ g_string_append_printf (str, "\\x%02x", *in);
|
||||
+ }
|
||||
+ return g_string_free (str, FALSE);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+create_systemd_scope (GDBusConnection *session_bus,
|
||||
+ GDesktopAppInfo *info,
|
||||
+ gint pid,
|
||||
+ GAsyncReadyCallback callback,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ GVariantBuilder builder;
|
||||
+ const char *app_name = g_get_application_name ();
|
||||
+ char *appid = NULL;
|
||||
+ char *appid_escaped = NULL;
|
||||
+ char *snid_escaped = NULL;
|
||||
+ char *unit_name = NULL;
|
||||
+
|
||||
+ /* In this order:
|
||||
+ * 1. Actual application ID from file
|
||||
+ * 2. Stripping the .desktop from the desktop ID
|
||||
+ * 3. Fall back to using the binary name
|
||||
+ */
|
||||
+ if (info->app_id)
|
||||
+ appid = g_strdup (info->app_id);
|
||||
+ else if (info->desktop_id && g_str_has_suffix (info->desktop_id, ".desktop"))
|
||||
+ appid = g_strndup (info->desktop_id, strlen (info->desktop_id) - 8);
|
||||
+ else
|
||||
+ appid = g_path_get_basename (info->binary);
|
||||
+
|
||||
+ appid_escaped = systemd_unit_name_escape (appid);
|
||||
+
|
||||
+ /* Generate a name conforming to
|
||||
+ * https://systemd.io/DESKTOP_ENVIRONMENTS/
|
||||
+ * We use the PID to disambiguate, as that should be unique enough.
|
||||
+ */
|
||||
+ unit_name = g_strdup_printf ("app-glib-%s-%d.scope", appid_escaped, pid);
|
||||
+
|
||||
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("(ssa(sv)a(sa(sv)))"));
|
||||
+ g_variant_builder_add (&builder, "s", unit_name);
|
||||
+ g_variant_builder_add (&builder, "s", "fail");
|
||||
+
|
||||
+ g_variant_builder_open (&builder, G_VARIANT_TYPE ("a(sv)"));
|
||||
+
|
||||
+ /* Add a generic human readable description, can be changed at will. */
|
||||
+ if (app_name)
|
||||
+ g_variant_builder_add (&builder,
|
||||
+ "(sv)",
|
||||
+ "Description",
|
||||
+ g_variant_new_take_string (g_strdup_printf ("Application launched by %s",
|
||||
+ app_name)));
|
||||
+ g_variant_builder_add (&builder,
|
||||
+ "(sv)",
|
||||
+ "PIDs",
|
||||
+ g_variant_new_fixed_array (G_VARIANT_TYPE_UINT32, &pid, 1, 4));
|
||||
+ /* Default to let systemd garbage collect failed applications we launched. */
|
||||
+ g_variant_builder_add (&builder,
|
||||
+ "(sv)",
|
||||
+ "CollectMode",
|
||||
+ g_variant_new_string ("inactive-or-failed"));
|
||||
+
|
||||
+ g_variant_builder_close (&builder);
|
||||
+
|
||||
+ g_variant_builder_open (&builder, G_VARIANT_TYPE ("a(sa(sv))"));
|
||||
+ g_variant_builder_close (&builder);
|
||||
+
|
||||
+ g_dbus_connection_call (session_bus,
|
||||
+ "org.freedesktop.systemd1",
|
||||
+ "/org/freedesktop/systemd1",
|
||||
+ "org.freedesktop.systemd1.Manager",
|
||||
+ "StartTransientUnit",
|
||||
+ g_variant_builder_end (&builder),
|
||||
+ G_VARIANT_TYPE ("(o)"),
|
||||
+ G_DBUS_CALL_FLAGS_NO_AUTO_START,
|
||||
+ 1000,
|
||||
+ NULL,
|
||||
+ callback,
|
||||
+ user_data);
|
||||
+
|
||||
+ g_free (appid);
|
||||
+ g_free (appid_escaped);
|
||||
+ g_free (snid_escaped);
|
||||
+ g_free (unit_name);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+systemd_scope_created_cb (GObject *object,
|
||||
+ GAsyncResult *result,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ GVariant *res = NULL;
|
||||
+ GError *error = NULL;
|
||||
+
|
||||
+ res = g_dbus_connection_call_finish (G_DBUS_CONNECTION (object), result, &error);
|
||||
+ if (error != NULL)
|
||||
+ {
|
||||
+ g_debug ("Failed to move new child into scope: %s", error->message);
|
||||
+ g_error_free (error);
|
||||
+ }
|
||||
+
|
||||
+ /* Unblock the waiting wrapper binary. */
|
||||
+ close (GPOINTER_TO_INT (user_data));
|
||||
+
|
||||
+ if (res)
|
||||
+ g_variant_unref (res);
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
static gboolean
|
||||
g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
GDBusConnection *session_bus,
|
||||
@@ -2750,13 +2892,14 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
GList *old_uris;
|
||||
GList *dup_uris;
|
||||
|
||||
- char **argv, **envp;
|
||||
+ GStrv argv = NULL, envp = NULL;
|
||||
+ GStrv wrapped_argv = NULL;
|
||||
+ GList *launched_uris = NULL;
|
||||
+ char *sn_id = NULL;
|
||||
int argc;
|
||||
|
||||
g_return_val_if_fail (info != NULL, FALSE);
|
||||
|
||||
- argv = NULL;
|
||||
-
|
||||
if (launch_context)
|
||||
envp = g_app_launch_context_get_environment (launch_context);
|
||||
else
|
||||
@@ -2770,27 +2913,19 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
do
|
||||
{
|
||||
GPid pid;
|
||||
- GList *launched_uris;
|
||||
GList *iter;
|
||||
- char *sn_id = NULL;
|
||||
- char **wrapped_argv;
|
||||
int i;
|
||||
- gsize j;
|
||||
- const gchar * const wrapper_argv[] =
|
||||
- {
|
||||
- "/bin/sh",
|
||||
- "-e",
|
||||
- "-u",
|
||||
- "-c", "export GIO_LAUNCHED_DESKTOP_FILE_PID=$$; exec \"$@\"",
|
||||
- "sh", /* argv[0] for sh */
|
||||
- };
|
||||
+#if defined(__linux__) && !defined(__BIONIC__)
|
||||
+ SpawnWrapperData wrapper_data;
|
||||
+#endif
|
||||
+ GSpawnChildSetupFunc setup = user_setup;
|
||||
+ gpointer setup_data = user_setup_data;
|
||||
|
||||
old_uris = dup_uris;
|
||||
if (!expand_application_parameters (info, exec_line, &dup_uris, &argc, &argv, error))
|
||||
- goto out;
|
||||
+ return FALSE;
|
||||
|
||||
/* Get the subset of URIs we're launching with this process */
|
||||
- launched_uris = NULL;
|
||||
for (iter = old_uris; iter != NULL && iter != dup_uris; iter = iter->next)
|
||||
launched_uris = g_list_prepend (launched_uris, iter->data);
|
||||
launched_uris = g_list_reverse (launched_uris);
|
||||
@@ -2799,7 +2934,7 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
{
|
||||
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
_("Unable to find terminal required for application"));
|
||||
- goto out;
|
||||
+ return FALSE;
|
||||
}
|
||||
|
||||
if (info->filename)
|
||||
@@ -2808,7 +2943,6 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
info->filename,
|
||||
TRUE);
|
||||
|
||||
- sn_id = NULL;
|
||||
if (launch_context)
|
||||
{
|
||||
GList *launched_files = create_files_for_uris (launched_uris);
|
||||
@@ -2837,38 +2971,93 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
* with a wrapper program (grep the GLib git history for
|
||||
* `gio-launch-desktop` for an example of this which could be
|
||||
* resurrected). */
|
||||
- wrapped_argv = g_new (char *, argc + G_N_ELEMENTS (wrapper_argv) + 1);
|
||||
+ wrapped_argv = g_new (char *, argc + 6 + 1);
|
||||
+
|
||||
+ wrapped_argv[0] = g_strdup ("/bin/sh");
|
||||
+ wrapped_argv[1] = g_strdup ("-e");
|
||||
+ wrapped_argv[2] = g_strdup ("-u");
|
||||
+ wrapped_argv[3] = g_strdup ("-c");
|
||||
+ /* argument 4 is filled in below */
|
||||
+ wrapped_argv[5] = g_strdup ("sh");
|
||||
|
||||
- for (j = 0; j < G_N_ELEMENTS (wrapper_argv); j++)
|
||||
- wrapped_argv[j] = g_strdup (wrapper_argv[j]);
|
||||
for (i = 0; i < argc; i++)
|
||||
- wrapped_argv[i + G_N_ELEMENTS (wrapper_argv)] = g_steal_pointer (&argv[i]);
|
||||
+ wrapped_argv[i + 6] = g_steal_pointer (&argv[i]);
|
||||
+
|
||||
+ wrapped_argv[i + 6] = NULL;
|
||||
+ g_clear_pointer (&argv, g_free);
|
||||
+
|
||||
+#if defined(__linux__) && !defined(__BIONIC__)
|
||||
+ /* Create pipes, if we use a setup func, then set cloexec,
|
||||
+ * otherwise our wrapper script will close both sides. */
|
||||
+ if (!g_unix_open_pipe (wrapper_data.pipe, 0, NULL))
|
||||
+ {
|
||||
+ g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
+ _("Unable to create pipe for systemd synchronization"));
|
||||
+ return FALSE;
|
||||
+ }
|
||||
+
|
||||
+ /* Set CLOEXEC on the write pipe, so we don't need to deal with it in the child. */
|
||||
+ fcntl (wrapper_data.pipe[1], F_SETFD, FD_CLOEXEC);
|
||||
|
||||
- wrapped_argv[i + G_N_ELEMENTS (wrapper_argv)] = NULL;
|
||||
- g_free (argv);
|
||||
- argv = NULL;
|
||||
+ if (!(spawn_flags & G_SPAWN_LEAVE_DESCRIPTORS_OPEN))
|
||||
+ {
|
||||
+ /* In this case, we use a setup function (which could probably also
|
||||
+ * overwrite envp to set GIO_LAUNCHED_DESKTOP_FILE_PID).
|
||||
+ *
|
||||
+ * Note that this does not incur an additional cost because
|
||||
+ * G_SPAWN_LEAVE_DESCRIPTOR_OPEN must be set in order to use
|
||||
+ * posix_spawn. */
|
||||
+ wrapper_data.user_setup = setup;
|
||||
+ wrapper_data.user_setup_data = setup_data;
|
||||
+
|
||||
+ setup = launch_uris_with_spawn_delay_exec;
|
||||
+ setup_data = &wrapper_data;
|
||||
+ }
|
||||
+
|
||||
+ wrapped_argv[4] = g_strdup_printf ("export GIO_LAUNCHED_DESKTOP_FILE_PID=$$; cat <&%1$d; exec \"$@\" %1$d<&-",
|
||||
+ wrapper_data.pipe[0]);
|
||||
+#else
|
||||
+ wrapped_argv[4] = g_strdup ("export GIO_LAUNCHED_DESKTOP_FILE_PID=$$; exec \"$@\"");
|
||||
+#endif
|
||||
|
||||
if (!g_spawn_async_with_fds (info->path,
|
||||
wrapped_argv,
|
||||
envp,
|
||||
spawn_flags,
|
||||
- user_setup,
|
||||
- user_setup_data,
|
||||
+ setup,
|
||||
+ setup_data,
|
||||
&pid,
|
||||
stdin_fd,
|
||||
stdout_fd,
|
||||
stderr_fd,
|
||||
error))
|
||||
{
|
||||
+#if defined(__linux__) && !defined(__BIONIC__)
|
||||
+ close (wrapper_data.pipe[0]);
|
||||
+ close (wrapper_data.pipe[1]);
|
||||
+#endif
|
||||
+
|
||||
if (sn_id)
|
||||
g_app_launch_context_launch_failed (launch_context, sn_id);
|
||||
|
||||
- g_free (sn_id);
|
||||
- g_list_free (launched_uris);
|
||||
-
|
||||
goto out;
|
||||
}
|
||||
|
||||
+#if defined(__linux__) && !defined(__BIONIC__)
|
||||
+ /* We close write side asynchronously later on when the dbus call
|
||||
+ * to systemd finishes. */
|
||||
+ close (wrapper_data.pipe[0]);
|
||||
+
|
||||
+ if (session_bus)
|
||||
+ create_systemd_scope (session_bus,
|
||||
+ info,
|
||||
+ pid,
|
||||
+ systemd_scope_created_cb,
|
||||
+ GINT_TO_POINTER (wrapper_data.pipe[1]));
|
||||
+ else
|
||||
+ close (wrapper_data.pipe[1]);
|
||||
+#endif
|
||||
+
|
||||
if (pid_callback != NULL)
|
||||
pid_callback (info, pid, pid_callback_data);
|
||||
|
||||
@@ -2893,19 +3082,20 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
sn_id,
|
||||
launched_uris);
|
||||
|
||||
- g_free (sn_id);
|
||||
- g_list_free (launched_uris);
|
||||
-
|
||||
- g_strfreev (wrapped_argv);
|
||||
- wrapped_argv = NULL;
|
||||
+ g_clear_pointer (&sn_id, g_free);
|
||||
+ g_clear_pointer (&launched_uris, g_list_free);
|
||||
+ g_clear_pointer (&wrapped_argv, g_strfreev);
|
||||
}
|
||||
while (dup_uris != NULL);
|
||||
|
||||
completed = TRUE;
|
||||
|
||||
- out:
|
||||
+out:
|
||||
g_strfreev (argv);
|
||||
g_strfreev (envp);
|
||||
+ g_clear_pointer (&wrapped_argv, g_strfreev);
|
||||
+ g_list_free (launched_uris);
|
||||
+ g_free (sn_id);
|
||||
|
||||
return completed;
|
||||
}
|
||||
--
|
||||
2.31.1
|
||||
|
||||
From cd67a1b0256d2397dac0836e154f3449b63a6b19 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Tue, 28 Jul 2020 12:11:13 +0200
|
||||
Subject: [PATCH 3/4] gdesktopappinfo: Handle task completion from spawn
|
||||
function
|
||||
|
||||
This allows delaying the return of the task until all dbus calls (in
|
||||
particular the ones to setup the scope) have finished.
|
||||
|
||||
This fixes the behaviour of the previous commit which would not
|
||||
correctly move the process into the scope if the application exited
|
||||
right after the task returned.
|
||||
---
|
||||
gio/gdesktopappinfo.c | 212 +++++++++++++++++++++++++++++-------------
|
||||
1 file changed, 146 insertions(+), 66 deletions(-)
|
||||
|
||||
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
|
||||
index afdcd42ac..8d0f1688e 100644
|
||||
--- a/gio/gdesktopappinfo.c
|
||||
+++ b/gio/gdesktopappinfo.c
|
||||
@@ -2849,11 +2849,17 @@ create_systemd_scope (GDBusConnection *session_bus,
|
||||
g_free (unit_name);
|
||||
}
|
||||
|
||||
+typedef struct {
|
||||
+ GTask *task;
|
||||
+ int fd;
|
||||
+} ScopeCreatedData;
|
||||
+
|
||||
static void
|
||||
systemd_scope_created_cb (GObject *object,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
+ ScopeCreatedData *data = user_data;
|
||||
GVariant *res = NULL;
|
||||
GError *error = NULL;
|
||||
|
||||
@@ -2865,13 +2871,47 @@ systemd_scope_created_cb (GObject *object,
|
||||
}
|
||||
|
||||
/* Unblock the waiting wrapper binary. */
|
||||
- close (GPOINTER_TO_INT (user_data));
|
||||
+
|
||||
+ close (data->fd);
|
||||
+
|
||||
+ if (data->task)
|
||||
+ {
|
||||
+ gint pending;
|
||||
+ pending = GPOINTER_TO_INT (g_task_get_task_data (data->task));
|
||||
+ pending -= 1;
|
||||
+ g_task_set_task_data (data->task, GINT_TO_POINTER (pending), NULL);
|
||||
+
|
||||
+ if (pending == 0 && !g_task_get_completed (data->task))
|
||||
+ g_task_return_boolean (data->task, TRUE);
|
||||
+ }
|
||||
|
||||
if (res)
|
||||
g_variant_unref (res);
|
||||
+ g_clear_object (&data->task);
|
||||
+ g_free (data);
|
||||
}
|
||||
#endif
|
||||
|
||||
+static void
|
||||
+launch_uris_with_spawn_flush_cb (GObject *object,
|
||||
+ GAsyncResult *result,
|
||||
+ gpointer user_data)
|
||||
+{
|
||||
+ GTask *task = G_TASK (user_data);
|
||||
+ gint pending;
|
||||
+
|
||||
+ g_dbus_connection_flush_finish (G_DBUS_CONNECTION (object), result, NULL);
|
||||
+
|
||||
+ pending = GPOINTER_TO_INT (g_task_get_task_data (task));
|
||||
+ pending -= 1;
|
||||
+ g_task_set_task_data (task, GINT_TO_POINTER (pending), NULL);
|
||||
+
|
||||
+ if (pending == 0 && !g_task_get_completed (task))
|
||||
+ g_task_return_boolean (task, TRUE);
|
||||
+
|
||||
+ g_object_unref (task);
|
||||
+}
|
||||
+
|
||||
static gboolean
|
||||
g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
GDBusConnection *session_bus,
|
||||
@@ -2886,9 +2926,10 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
gint stdin_fd,
|
||||
gint stdout_fd,
|
||||
gint stderr_fd,
|
||||
- GError **error)
|
||||
+ GTask *task,
|
||||
+ GError **error_out)
|
||||
{
|
||||
- gboolean completed = FALSE;
|
||||
+ GError *error = NULL;
|
||||
GList *old_uris;
|
||||
GList *dup_uris;
|
||||
|
||||
@@ -2898,8 +2939,15 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
char *sn_id = NULL;
|
||||
int argc;
|
||||
|
||||
+ /* We may get a task to report back on or an error. But never both. */
|
||||
+ g_assert (!(task && error_out));
|
||||
g_return_val_if_fail (info != NULL, FALSE);
|
||||
|
||||
+ /* Surrounding code must not have set any data on the task
|
||||
+ * (it is cleared before calling this function). */
|
||||
+ if (session_bus && task)
|
||||
+ g_assert (g_task_get_task_data (task) == NULL);
|
||||
+
|
||||
if (launch_context)
|
||||
envp = g_app_launch_context_get_environment (launch_context);
|
||||
else
|
||||
@@ -2922,8 +2970,8 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
gpointer setup_data = user_setup_data;
|
||||
|
||||
old_uris = dup_uris;
|
||||
- if (!expand_application_parameters (info, exec_line, &dup_uris, &argc, &argv, error))
|
||||
- return FALSE;
|
||||
+ if (!expand_application_parameters (info, exec_line, &dup_uris, &argc, &argv, &error))
|
||||
+ goto out;
|
||||
|
||||
/* Get the subset of URIs we're launching with this process */
|
||||
for (iter = old_uris; iter != NULL && iter != dup_uris; iter = iter->next)
|
||||
@@ -2932,9 +2980,9 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
|
||||
if (info->terminal && !prepend_terminal_to_vector (&argc, &argv))
|
||||
{
|
||||
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
- _("Unable to find terminal required for application"));
|
||||
- return FALSE;
|
||||
+ error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
+ _("Unable to find terminal required for application"));
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (info->filename)
|
||||
@@ -2991,9 +3039,9 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
* otherwise our wrapper script will close both sides. */
|
||||
if (!g_unix_open_pipe (wrapper_data.pipe, 0, NULL))
|
||||
{
|
||||
- g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
- _("Unable to create pipe for systemd synchronization"));
|
||||
- return FALSE;
|
||||
+ error = g_error_new_literal (G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
+ _("Unable to create pipe for systemd synchronization"));
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
/* Set CLOEXEC on the write pipe, so we don't need to deal with it in the child. */
|
||||
@@ -3030,7 +3078,7 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
stdin_fd,
|
||||
stdout_fd,
|
||||
stderr_fd,
|
||||
- error))
|
||||
+ &error))
|
||||
{
|
||||
#if defined(__linux__) && !defined(__BIONIC__)
|
||||
close (wrapper_data.pipe[0]);
|
||||
@@ -3049,11 +3097,29 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
close (wrapper_data.pipe[0]);
|
||||
|
||||
if (session_bus)
|
||||
- create_systemd_scope (session_bus,
|
||||
- info,
|
||||
- pid,
|
||||
- systemd_scope_created_cb,
|
||||
- GINT_TO_POINTER (wrapper_data.pipe[1]));
|
||||
+ {
|
||||
+ ScopeCreatedData *data;
|
||||
+
|
||||
+ data = g_new0 (ScopeCreatedData, 1);
|
||||
+
|
||||
+ if (task)
|
||||
+ {
|
||||
+ gint pending;
|
||||
+ pending = GPOINTER_TO_INT (g_task_get_task_data (task));
|
||||
+ pending += 1;
|
||||
+ g_task_set_task_data (task, GINT_TO_POINTER (pending), NULL);
|
||||
+
|
||||
+ data->task = g_object_ref (task);
|
||||
+ }
|
||||
+
|
||||
+ data->fd = wrapper_data.pipe[1];
|
||||
+
|
||||
+ create_systemd_scope (session_bus,
|
||||
+ info,
|
||||
+ pid,
|
||||
+ systemd_scope_created_cb,
|
||||
+ data);
|
||||
+ }
|
||||
else
|
||||
close (wrapper_data.pipe[1]);
|
||||
#endif
|
||||
@@ -3088,8 +3154,6 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info,
|
||||
}
|
||||
while (dup_uris != NULL);
|
||||
|
||||
- completed = TRUE;
|
||||
-
|
||||
out:
|
||||
g_strfreev (argv);
|
||||
g_strfreev (envp);
|
||||
@@ -3097,7 +3161,52 @@ out:
|
||||
g_list_free (launched_uris);
|
||||
g_free (sn_id);
|
||||
|
||||
- return completed;
|
||||
+ if (!error)
|
||||
+ {
|
||||
+ if (session_bus && task)
|
||||
+ {
|
||||
+ GCancellable *cancellable = g_task_get_cancellable (task);
|
||||
+ gint pending;
|
||||
+ pending = GPOINTER_TO_INT (g_task_get_task_data (task));
|
||||
+ pending += 1;
|
||||
+ g_task_set_task_data (task, GINT_TO_POINTER (pending), NULL);
|
||||
+
|
||||
+ /* FIXME: The D-Bus message from the notify_desktop_launch() function
|
||||
+ * can be still lost even if flush is called later. See:
|
||||
+ * https://gitlab.freedesktop.org/dbus/dbus/issues/72
|
||||
+ */
|
||||
+ g_dbus_connection_flush (session_bus,
|
||||
+ cancellable,
|
||||
+ launch_uris_with_spawn_flush_cb,
|
||||
+ g_steal_pointer (&task));
|
||||
+ }
|
||||
+ else if (session_bus)
|
||||
+ {
|
||||
+ /* No task available. */
|
||||
+ g_dbus_connection_flush (session_bus,
|
||||
+ NULL,
|
||||
+ NULL,
|
||||
+ NULL);
|
||||
+ }
|
||||
+ else if (task)
|
||||
+ {
|
||||
+ /* Return the given task. */
|
||||
+ g_task_return_boolean (task, TRUE);
|
||||
+ g_object_unref (task);
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (task)
|
||||
+ {
|
||||
+ g_task_return_error (task, error);
|
||||
+ g_object_unref (task);
|
||||
+ }
|
||||
+ else
|
||||
+ g_propagate_error (error_out, error);
|
||||
+ }
|
||||
+
|
||||
+ return !error;
|
||||
}
|
||||
|
||||
static gchar *
|
||||
@@ -3246,17 +3355,9 @@ g_desktop_app_info_launch_uris_internal (GAppInfo *appinfo,
|
||||
success = g_desktop_app_info_launch_uris_with_spawn (info, session_bus, info->exec, uris, launch_context,
|
||||
spawn_flags, user_setup, user_setup_data,
|
||||
pid_callback, pid_callback_data,
|
||||
- stdin_fd, stdout_fd, stderr_fd, error);
|
||||
+ stdin_fd, stdout_fd, stderr_fd, NULL, error);
|
||||
|
||||
- if (session_bus != NULL)
|
||||
- {
|
||||
- /* This asynchronous flush holds a reference until it completes,
|
||||
- * which ensures that the following unref won't immediately kill
|
||||
- * the connection if we were the initial owner.
|
||||
- */
|
||||
- g_dbus_connection_flush (session_bus, NULL, NULL, NULL);
|
||||
- g_object_unref (session_bus);
|
||||
- }
|
||||
+ g_clear_object (&session_bus);
|
||||
|
||||
return success;
|
||||
}
|
||||
@@ -3310,18 +3411,6 @@ launch_uris_with_dbus_cb (GObject *object,
|
||||
g_object_unref (task);
|
||||
}
|
||||
|
||||
-static void
|
||||
-launch_uris_flush_cb (GObject *object,
|
||||
- GAsyncResult *result,
|
||||
- gpointer user_data)
|
||||
-{
|
||||
- GTask *task = G_TASK (user_data);
|
||||
-
|
||||
- g_dbus_connection_flush_finish (G_DBUS_CONNECTION (object), result, NULL);
|
||||
- g_task_return_boolean (task, TRUE);
|
||||
- g_object_unref (task);
|
||||
-}
|
||||
-
|
||||
static void
|
||||
launch_uris_bus_get_cb (GObject *object,
|
||||
GAsyncResult *result,
|
||||
@@ -3330,12 +3419,20 @@ launch_uris_bus_get_cb (GObject *object,
|
||||
GTask *task = G_TASK (user_data);
|
||||
GDesktopAppInfo *info = G_DESKTOP_APP_INFO (g_task_get_source_object (task));
|
||||
LaunchUrisData *data = g_task_get_task_data (task);
|
||||
+ LaunchUrisData *data_copy = NULL;
|
||||
GCancellable *cancellable = g_task_get_cancellable (task);
|
||||
GDBusConnection *session_bus;
|
||||
- GError *error = NULL;
|
||||
|
||||
session_bus = g_bus_get_finish (result, NULL);
|
||||
|
||||
+ data_copy = g_new0 (LaunchUrisData, 1);
|
||||
+ data_copy->appinfo = g_steal_pointer (&data->appinfo);
|
||||
+ data_copy->uris = g_steal_pointer (&data->uris);
|
||||
+ data_copy->context = g_steal_pointer (&data->context);
|
||||
+
|
||||
+ /* Allow other data to be attached to the task. */
|
||||
+ g_task_set_task_data (task, NULL, NULL);
|
||||
+
|
||||
if (session_bus && info->app_id)
|
||||
{
|
||||
/* FIXME: The g_document_portal_add_documents() function, which is called
|
||||
@@ -3343,34 +3440,21 @@ launch_uris_bus_get_cb (GObject *object,
|
||||
* uses blocking calls.
|
||||
*/
|
||||
g_desktop_app_info_launch_uris_with_dbus (info, session_bus,
|
||||
- data->uris, data->context,
|
||||
+ data_copy->uris, data_copy->context,
|
||||
cancellable,
|
||||
launch_uris_with_dbus_cb,
|
||||
g_steal_pointer (&task));
|
||||
}
|
||||
else
|
||||
{
|
||||
- /* FIXME: The D-Bus message from the notify_desktop_launch() function
|
||||
- * can be still lost even if flush is called later. See:
|
||||
- * https://gitlab.freedesktop.org/dbus/dbus/issues/72
|
||||
- */
|
||||
g_desktop_app_info_launch_uris_with_spawn (info, session_bus, info->exec,
|
||||
- data->uris, data->context,
|
||||
+ data_copy->uris, data_copy->context,
|
||||
_SPAWN_FLAGS_DEFAULT, NULL,
|
||||
NULL, NULL, NULL, -1, -1, -1,
|
||||
- &error);
|
||||
- if (error != NULL)
|
||||
- {
|
||||
- g_task_return_error (task, g_steal_pointer (&error));
|
||||
- g_object_unref (task);
|
||||
- }
|
||||
- else
|
||||
- g_dbus_connection_flush (session_bus,
|
||||
- cancellable,
|
||||
- launch_uris_flush_cb,
|
||||
- g_steal_pointer (&task));
|
||||
+ g_steal_pointer (&task), NULL);
|
||||
}
|
||||
|
||||
+ launch_uris_data_free (data_copy);
|
||||
g_clear_object (&session_bus);
|
||||
}
|
||||
|
||||
@@ -5186,16 +5270,12 @@ g_desktop_app_info_launch_action (GDesktopAppInfo *info,
|
||||
if (exec_line)
|
||||
g_desktop_app_info_launch_uris_with_spawn (info, session_bus, exec_line, NULL, launch_context,
|
||||
_SPAWN_FLAGS_DEFAULT, NULL, NULL, NULL, NULL,
|
||||
- -1, -1, -1, NULL);
|
||||
+ -1, -1, -1, NULL, NULL);
|
||||
|
||||
g_free (exec_line);
|
||||
}
|
||||
|
||||
- if (session_bus != NULL)
|
||||
- {
|
||||
- g_dbus_connection_flush (session_bus, NULL, NULL, NULL);
|
||||
- g_object_unref (session_bus);
|
||||
- }
|
||||
+ g_clear_object (&session_bus);
|
||||
}
|
||||
/* Epilogue {{{1 */
|
||||
|
||||
--
|
||||
2.31.1
|
||||
|
||||
From 8da8a3ef6df8af6de8bd388192bebe8b51b3e782 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Berg <bberg@redhat.com>
|
||||
Date: Thu, 17 Sep 2020 17:35:58 +0200
|
||||
Subject: [PATCH 4/4] gdesktopappinfo: Add SourcePath= to transient systemd
|
||||
units
|
||||
|
||||
systemd allows setting a SourcePath= which shows the file that the unit
|
||||
has been generated from. KDE is starting to set this and it seems like a
|
||||
good idea, so do the same here.
|
||||
|
||||
See https://invent.kde.org/frameworks/kio/-/merge_requests/124
|
||||
---
|
||||
gio/gdesktopappinfo.c | 13 +++++++++++++
|
||||
1 file changed, 13 insertions(+)
|
||||
|
||||
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
|
||||
index 8d0f1688e..a833de4e6 100644
|
||||
--- a/gio/gdesktopappinfo.c
|
||||
+++ b/gio/gdesktopappinfo.c
|
||||
@@ -2777,6 +2777,7 @@ create_systemd_scope (GDBusConnection *session_bus,
|
||||
{
|
||||
GVariantBuilder builder;
|
||||
const char *app_name = g_get_application_name ();
|
||||
+ const char *source_path = NULL;
|
||||
char *appid = NULL;
|
||||
char *appid_escaped = NULL;
|
||||
char *snid_escaped = NULL;
|
||||
@@ -2802,6 +2803,8 @@ create_systemd_scope (GDBusConnection *session_bus,
|
||||
*/
|
||||
unit_name = g_strdup_printf ("app-glib-%s-%d.scope", appid_escaped, pid);
|
||||
|
||||
+ source_path = g_desktop_app_info_get_filename (info);
|
||||
+
|
||||
g_variant_builder_init (&builder, G_VARIANT_TYPE ("(ssa(sv)a(sa(sv)))"));
|
||||
g_variant_builder_add (&builder, "s", unit_name);
|
||||
g_variant_builder_add (&builder, "s", "fail");
|
||||
@@ -2815,6 +2818,16 @@ create_systemd_scope (GDBusConnection *session_bus,
|
||||
"Description",
|
||||
g_variant_new_take_string (g_strdup_printf ("Application launched by %s",
|
||||
app_name)));
|
||||
+
|
||||
+ /* If we have a .desktop file, document that the scope has been "generated"
|
||||
+ * from it.
|
||||
+ */
|
||||
+ if (source_path && g_utf8_validate (source_path, -1, NULL))
|
||||
+ g_variant_builder_add (&builder,
|
||||
+ "(sv)",
|
||||
+ "SourcePath",
|
||||
+ g_variant_new_string (source_path));
|
||||
+
|
||||
g_variant_builder_add (&builder,
|
||||
"(sv)",
|
||||
"PIDs",
|
||||
--
|
||||
2.31.1
|
|
@ -1,4 +1,4 @@
|
|||
From ff90bb8474b1e724727f4014b446e7c851e609bd Mon Sep 17 00:00:00 2001
|
||||
From 561b594fe58c3ea1c6387c64c59f4816c1fd1c38 Mon Sep 17 00:00:00 2001
|
||||
From: Colin Walters <walters@verbum.org>
|
||||
Date: Fri, 7 Jun 2019 18:44:43 +0000
|
||||
Subject: [PATCH 1/4] ghmac: Split off wrapper functions into ghmac-utils.c
|
||||
|
@ -284,10 +284,10 @@ index 49fd272f0..4f181f21f 100644
|
|||
- (const guchar *) str, length);
|
||||
-}
|
||||
diff --git a/glib/meson.build b/glib/meson.build
|
||||
index 8c18e6de4..329b8d197 100644
|
||||
index 93600b29e..cce338969 100644
|
||||
--- a/glib/meson.build
|
||||
+++ b/glib/meson.build
|
||||
@@ -253,6 +253,7 @@ glib_sources = files(
|
||||
@@ -251,6 +251,7 @@ glib_sources = files(
|
||||
'ggettext.c',
|
||||
'ghash.c',
|
||||
'ghmac.c',
|
||||
|
@ -298,7 +298,7 @@ index 8c18e6de4..329b8d197 100644
|
|||
--
|
||||
2.31.1
|
||||
|
||||
From 5395d36e6685e0b7377794c59c5820970bb472ef Mon Sep 17 00:00:00 2001
|
||||
From b87b28e06c6300479e292782100e9b94ebb6a140 Mon Sep 17 00:00:00 2001
|
||||
From: Colin Walters <walters@verbum.org>
|
||||
Date: Fri, 7 Jun 2019 19:36:54 +0000
|
||||
Subject: [PATCH 2/4] Add a gnutls backend for GHmac
|
||||
|
@ -659,10 +659,10 @@ index 4f181f21f..0e39ea40a 100644
|
|||
* Use g_hmac_unref() to free the memory allocated by it.
|
||||
*
|
||||
diff --git a/glib/meson.build b/glib/meson.build
|
||||
index 329b8d197..2417de53d 100644
|
||||
index cce338969..1f6bb35d1 100644
|
||||
--- a/glib/meson.build
|
||||
+++ b/glib/meson.build
|
||||
@@ -252,7 +252,6 @@ glib_sources = files(
|
||||
@@ -250,7 +250,6 @@ glib_sources = files(
|
||||
'gfileutils.c',
|
||||
'ggettext.c',
|
||||
'ghash.c',
|
||||
|
@ -670,7 +670,7 @@ index 329b8d197..2417de53d 100644
|
|||
'ghmac-utils.c',
|
||||
'ghook.c',
|
||||
'ghostutils.c',
|
||||
@@ -308,6 +307,7 @@ glib_sources = files(
|
||||
@@ -306,6 +305,7 @@ glib_sources = files(
|
||||
'guriprivate.h',
|
||||
'gutils.c',
|
||||
'gutilsprivate.h',
|
||||
|
@ -678,7 +678,7 @@ index 329b8d197..2417de53d 100644
|
|||
'guuid.c',
|
||||
'gvariant.c',
|
||||
'gvariant-core.c',
|
||||
@@ -352,6 +352,12 @@ else
|
||||
@@ -350,6 +350,12 @@ else
|
||||
glib_dtrace_hdr = []
|
||||
endif
|
||||
|
||||
|
@ -691,20 +691,20 @@ index 329b8d197..2417de53d 100644
|
|||
pcre_static_args = []
|
||||
|
||||
if use_pcre_static_flag
|
||||
@@ -378,7 +384,7 @@ libglib = library('glib-2.0',
|
||||
@@ -368,7 +374,7 @@ libglib = library('glib-2.0',
|
||||
# intl.lib is not compatible with SAFESEH
|
||||
link_args : [noseh_link_args, glib_link_flags, win32_ldflags],
|
||||
include_directories : configinc,
|
||||
- dependencies : pcre_deps + [thread_dep, librt] + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep],
|
||||
+ dependencies : pcre_deps + [thread_dep, librt] + libgnutls_dep + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep],
|
||||
- dependencies : [pcre, thread_dep, librt] + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep],
|
||||
+ dependencies : [pcre, thread_dep, librt] + libgnutls_dep + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep],
|
||||
c_args : glib_c_args,
|
||||
objc_args : glib_c_args,
|
||||
)
|
||||
diff --git a/meson.build b/meson.build
|
||||
index e2eba1871..cca15f653 100644
|
||||
index 1b54fdcae..98f8925a2 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -2090,6 +2090,13 @@ if host_system == 'linux'
|
||||
@@ -2095,6 +2095,13 @@ if host_system == 'linux'
|
||||
glib_conf.set('HAVE_LIBMOUNT', libmount_dep.found())
|
||||
endif
|
||||
|
||||
|
@ -719,12 +719,12 @@ index e2eba1871..cca15f653 100644
|
|||
winsock2 = cc.find_library('ws2_32')
|
||||
endif
|
||||
diff --git a/meson_options.txt b/meson_options.txt
|
||||
index 072765361..c8f26ac02 100644
|
||||
index 6cd7bc90a..65af1d276 100644
|
||||
--- a/meson_options.txt
|
||||
+++ b/meson_options.txt
|
||||
@@ -39,6 +39,11 @@ option('internal_pcre',
|
||||
value : false,
|
||||
description : 'whether to use internal PCRE')
|
||||
@@ -34,6 +34,11 @@ option('libmount',
|
||||
value : 'auto',
|
||||
description : 'build with libmount support')
|
||||
|
||||
+option('gnutls',
|
||||
+ type : 'boolean',
|
||||
|
@ -734,10 +734,17 @@ index 072765361..c8f26ac02 100644
|
|||
option('man',
|
||||
type : 'boolean',
|
||||
value : false,
|
||||
@@ -121,4 +126,4 @@ option('glib_checks',
|
||||
option('libelf',
|
||||
type : 'feature',
|
||||
value : 'auto',
|
||||
- description : 'Enable support for listing and extracting from ELF resource files with gresource tool')
|
||||
\ No newline at end of file
|
||||
+ description : 'Enable support for listing and extracting from ELF resource files with gresource tool')
|
||||
--
|
||||
2.31.1
|
||||
|
||||
From 61c175277acb8d1e080305acd444201c5ad1fb81 Mon Sep 17 00:00:00 2001
|
||||
From 379e559f5aa390272368f83ca3e6af092066ae75 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Catanzaro <mcatanzaro@redhat.com>
|
||||
Date: Wed, 16 Jun 2021 20:35:00 -0500
|
||||
Subject: [PATCH 3/4] dlopen GnuTLS instead of linking directly
|
||||
|
@ -919,23 +926,23 @@ index 0e39ea40a..2d9be91b8 100644
|
|||
#endif
|
||||
|
||||
diff --git a/glib/meson.build b/glib/meson.build
|
||||
index 2417de53d..ba42951aa 100644
|
||||
index 1f6bb35d1..f4041e50c 100644
|
||||
--- a/glib/meson.build
|
||||
+++ b/glib/meson.build
|
||||
@@ -384,7 +384,7 @@ libglib = library('glib-2.0',
|
||||
@@ -374,7 +374,7 @@ libglib = library('glib-2.0',
|
||||
# intl.lib is not compatible with SAFESEH
|
||||
link_args : [noseh_link_args, glib_link_flags, win32_ldflags],
|
||||
include_directories : configinc,
|
||||
- dependencies : pcre_deps + [thread_dep, librt] + libgnutls_dep + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep],
|
||||
+ dependencies : pcre_deps + [thread_dep, librt] + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep] + [libdl_dep],
|
||||
- dependencies : [pcre, thread_dep, librt] + libgnutls_dep + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep],
|
||||
+ dependencies : [pcre, thread_dep, librt] + libintl_deps + libiconv + platform_deps + [gnulib_libm_dependency, libm] + [libsysprof_capture_dep] + [libdl_dep],
|
||||
c_args : glib_c_args,
|
||||
objc_args : glib_c_args,
|
||||
)
|
||||
diff --git a/meson.build b/meson.build
|
||||
index cca15f653..404ef1790 100644
|
||||
index 98f8925a2..bbe26e4e4 100644
|
||||
--- a/meson.build
|
||||
+++ b/meson.build
|
||||
@@ -2090,11 +2090,9 @@ if host_system == 'linux'
|
||||
@@ -2095,11 +2095,9 @@ if host_system == 'linux'
|
||||
glib_conf.set('HAVE_LIBMOUNT', libmount_dep.found())
|
||||
endif
|
||||
|
||||
|
@ -952,7 +959,7 @@ index cca15f653..404ef1790 100644
|
|||
--
|
||||
2.31.1
|
||||
|
||||
From 7d1d96311b6ecd4f90ebbdd6fc58d28e06a86887 Mon Sep 17 00:00:00 2001
|
||||
From 54e7d0982c73692e92ddd8eaa328f2fbedf05688 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Catanzaro <mcatanzaro@redhat.com>
|
||||
Date: Wed, 16 Jun 2021 20:46:24 -0500
|
||||
Subject: [PATCH 4/4] Add test for GHmac in FIPS mode
|
||||
|
@ -1084,3 +1091,4 @@ index 3ac3206df..2fa447984 100644
|
|||
}
|
||||
--
|
||||
2.31.1
|
||||
|
||||
|
|
199
SPECS/glib2.spec
199
SPECS/glib2.spec
|
@ -1,47 +1,30 @@
|
|||
## START: Set by rpmautospec
|
||||
## (rpmautospec version 0.2.5)
|
||||
%define autorelease(e:s:pb:) %{?-p:0.}%{lua:
|
||||
release_number = 1;
|
||||
base_release_number = tonumber(rpm.expand("%{?-b*}%{!?-b:1}"));
|
||||
print(release_number + base_release_number - 1);
|
||||
}%{?-e:.%{-e*}}%{?-s:.%{-s*}}%{?dist}
|
||||
## END: Set by rpmautospec
|
||||
|
||||
Name: glib2
|
||||
Version: 2.68.4
|
||||
Release: 11%{?dist}
|
||||
Version: 2.70.2
|
||||
Release: %autorelease
|
||||
Summary: A library of handy utility functions
|
||||
|
||||
License: LGPLv2+
|
||||
URL: http://www.gtk.org
|
||||
Source0: http://download.gnome.org/sources/glib/2.68/glib-%{version}.tar.xz
|
||||
URL: https://www.gtk.org
|
||||
Source0: https://download.gnome.org/sources/glib/2.70/glib-%{version}.tar.xz
|
||||
|
||||
# Required for RHEL core crypto components policy. Good for Fedora too.
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1630260
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/903
|
||||
Patch: gnutls-hmac.patch
|
||||
Patch0: gnutls-hmac.patch
|
||||
|
||||
# Add GPowerProfileMonitor
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1965
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2194
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2222
|
||||
Patch: 1965.patch
|
||||
Patch: 2194.patch
|
||||
Patch: 2222.patch
|
||||
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2244
|
||||
Patch: 2244.patch
|
||||
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2291
|
||||
Patch: 2291.patch
|
||||
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1968
|
||||
Patch: 1968.patch
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2435
|
||||
Patch: 2435.patch
|
||||
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3126
|
||||
Patch: 3126.patch
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3136
|
||||
Patch: 3136.patch
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3163
|
||||
Patch: 3163.patch
|
||||
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2826
|
||||
# https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3272
|
||||
Patch: 2826.patch
|
||||
Patch: 3272.patch
|
||||
# Add patches to move applications into systemd scopes in compliance with
|
||||
# https://systemd.io/DESKTOP_ENVIRONMENTS/
|
||||
# Proposed upstream at https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1596
|
||||
Patch1: gdesktopappinfo.patch
|
||||
|
||||
BuildRequires: chrpath
|
||||
BuildRequires: gcc
|
||||
|
@ -63,6 +46,7 @@ BuildRequires: pkgconfig(mount)
|
|||
BuildRequires: pkgconfig(sysprof-capture-4)
|
||||
BuildRequires: pkgconfig(zlib)
|
||||
BuildRequires: python3-devel
|
||||
BuildRequires: /usr/bin/marshalparser
|
||||
|
||||
# For gnutls-hmac.patch. We now dlopen libgnutls.so.30 so that we can build a
|
||||
# static glib2 without depending on a static build of GnuTLS as well. This will
|
||||
|
@ -76,9 +60,6 @@ Requires: libgnutls.so.30
|
|||
# Remove gamin dependency
|
||||
Obsoletes: glib2-fam < 2.67.1-3
|
||||
|
||||
# glib 2.59.0 hash table changes broke older gcr versions / password prompts in gnome-shell
|
||||
Conflicts: gcr < 3.28.1
|
||||
|
||||
Provides: bundled(gnulib)
|
||||
Provides: bundled(gvdb)
|
||||
Provides: bundled(libcharset)
|
||||
|
@ -90,6 +71,7 @@ such as GTK+ and GNOME. It provides data structure handling for C,
|
|||
portability wrappers, and interfaces for such runtime functionality
|
||||
as an event loop, threads, dynamic loading, and an object system.
|
||||
|
||||
|
||||
%package devel
|
||||
Summary: A library of handy utility functions
|
||||
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||
|
@ -124,8 +106,9 @@ the functionality of the installed glib2 package.
|
|||
%autosetup -n glib-%{version} -p1
|
||||
|
||||
%build
|
||||
# Bug 1324770: Also explicitly remove PCRE sources since we use --with-pcre=system
|
||||
rm glib/pcre/*.[ch]
|
||||
# No surprise bundled libraries
|
||||
rm -rf glib/pcre
|
||||
rm -rf subprojects
|
||||
|
||||
%meson \
|
||||
-Dman=true \
|
||||
|
@ -143,19 +126,25 @@ rm glib/pcre/*.[ch]
|
|||
|
||||
%install
|
||||
%meson_install
|
||||
# Since this is a generated .py file, set it to a known timestamp for
|
||||
# better reproducibility.
|
||||
|
||||
# We need reproducible .pyc files across architectures to support multilib installations
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=2008912
|
||||
# https://docs.fedoraproject.org/en-US/packaging-guidelines/Python_Appendix/#_byte_compilation_reproducibility
|
||||
%global py_reproducible_pyc_path %{buildroot}%{_datadir}
|
||||
|
||||
# Since this is a generated .py file, set it to a known timestamp
|
||||
# because the source timestamp is baked into the .pyc file
|
||||
# Also copy the timestamp for other .py files, because meson doesn't
|
||||
# do this, see https://github.com/mesonbuild/meson/issues/5027.
|
||||
touch -r gio/gdbus-2.0/codegen/config.py.in %{buildroot}%{_datadir}/glib-2.0/codegen/*.py
|
||||
|
||||
chrpath --delete %{buildroot}%{_libdir}/*.so
|
||||
|
||||
# Perform byte compilation manually to avoid issues with
|
||||
# irreproducibility of the default invalidation mode, see
|
||||
# https://www.python.org/dev/peps/pep-0552/ and
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1686078
|
||||
export PYTHONHASHSEED=0
|
||||
%py_byte_compile %{__python3} %{buildroot}%{_datadir}
|
||||
%py_byte_compile %{python3} %{buildroot}%{_datadir}
|
||||
|
||||
mv %{buildroot}%{_bindir}/gio-querymodules %{buildroot}%{_bindir}/gio-querymodules-%{__isa_bits}
|
||||
sed -i -e "/^gio_querymodules=/s/gio-querymodules/gio-querymodules-%{__isa_bits}/" %{buildroot}%{_libdir}/pkgconfig/gio-2.0.pc
|
||||
|
@ -258,106 +247,85 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &> /dev/null || :
|
|||
%{_datadir}/installed-tests
|
||||
|
||||
%changelog
|
||||
* Wed Jul 19 2023 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-11
|
||||
- Really fix authentication failures when sd-bus clients connect to GDBus servers
|
||||
- Resolves: #2217771
|
||||
* Mon Dec 06 2021 Kalev Lember <klember@redhat.com> 2.70.2-1
|
||||
- Update to 2.70.2
|
||||
|
||||
* Thu Jul 06 2023 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-10
|
||||
- Fix authentication failures when sd-bus clients connect to GDBus servers
|
||||
- Resolves: #2217771
|
||||
* Thu Oct 28 2021 Kalev Lember <klember@redhat.com> 2.70.1-1
|
||||
- Update to 2.70.1
|
||||
|
||||
* Thu May 25 2023 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-9
|
||||
- Resolve s390x crashes introduced by fixes for CVE-2023-24593/CVE-2023-25180
|
||||
- Related: #2181196
|
||||
- Related: #2181200
|
||||
* Fri Oct 15 2021 Kalev Lember <klember@redhat.com> 2.70.0-5
|
||||
- Fix network state monitoring to work with NetworkManager 1.32 (#1991075)
|
||||
|
||||
* Wed May 17 2023 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-8
|
||||
- Resolve use after free introduced by fixes for CVE-2023-24593/CVE-2023-25180
|
||||
- Related: #2181196
|
||||
- Related: #2181200
|
||||
* Tue Oct 05 2021 Miro Hrončok <miro@hroncok.cz> 2.70.0-4
|
||||
- Produce bit-by-bit identical .pyc files across different architectures,
|
||||
to avoid multilib conflicts
|
||||
|
||||
* Fri Mar 24 2023 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-7
|
||||
- Fix CVE-2023-24593 and CVE-2023-25180
|
||||
- Resolves: #2181196
|
||||
- Resolves: #2181200
|
||||
* Wed Sep 22 2021 Michael Catanzaro <mcatanzaro@redhat.com> 2.70.0-3
|
||||
- Remove workaround for gnome-keyring
|
||||
|
||||
* Fri Dec 02 2022 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-6
|
||||
- Drop gdesktopappinfo patchset
|
||||
- Resolves: #2150307
|
||||
* Tue Sep 21 2021 Adam Williamson <awilliam@redhat.com> 2.70.0-2
|
||||
- Re-enable a workaround to fix g-i-s/gnome-keyring (#2005625)
|
||||
|
||||
* Fri Jan 21 2022 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-5
|
||||
- Add one more upstream patch to gspawn patchset
|
||||
- Related: #1910092
|
||||
* Fri Sep 17 2021 Kalev Lember <klember@redhat.com> 2.70.0-1
|
||||
- Update to 2.70.0
|
||||
|
||||
* Fri Jan 21 2022 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-4
|
||||
- Add gspawn patchset
|
||||
- Resolves: #1910092
|
||||
* Wed Sep 08 2021 Kalev Lember <klember@redhat.com> 2.69.3-1
|
||||
- Update to 2.69.3
|
||||
|
||||
* Wed Dec 01 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-3
|
||||
- Fix GNetworkMonitor after NetworkManager D-Bus API changes
|
||||
- Resolves: #2014624
|
||||
* Sat Aug 21 2021 Kalev Lember <klember@redhat.com> 2.69.2-1
|
||||
- Update to 2.69.2
|
||||
|
||||
* Wed Sep 15 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.4-2
|
||||
- Fix g_get_user_database_entry() crash when used with nss-systemd
|
||||
- Resolves: #2004711
|
||||
* Wed Jul 21 2021 Michael Catanzaro <mcatanzaro@redhat.com> 2.69.0-1
|
||||
- Upgrade to 2.69.0
|
||||
|
||||
* Sat Aug 21 2021 Kalev Lember <klember@redhat.com> - 2.68.4-1
|
||||
- Update to 2.68.4
|
||||
* Mon Jul 12 2021 Michael Catanzaro <mcatanzaro@redhat.com> 2.68.3-13
|
||||
- Note: all those previous empty commits accomplished nothing
|
||||
|
||||
* Wed Aug 18 2021 DJ Delorie <dj@redhat.com> - 2.68.3-6
|
||||
- Rebuilt for libffi 3.4.2 SONAME transition.
|
||||
Related: rhbz#1891914
|
||||
* Mon Jul 12 2021 Michael Catanzaro <mcatanzaro@redhat.com> 2.68.3-12
|
||||
- Empty commit for rpmautospec -5
|
||||
|
||||
* Tue Aug 17 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.3-5
|
||||
- Backport GPowerProfileMonitor
|
||||
- Resolves: #1994466
|
||||
* Mon Jul 12 2021 Michael Catanzaro <mcatanzaro@redhat.com> 2.68.3-11
|
||||
- Empty commit for rpmautospec -4
|
||||
|
||||
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 2.68.3-4
|
||||
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
||||
Related: rhbz#1991688
|
||||
* Mon Jul 12 2021 Michael Catanzaro <mcatanzaro@redhat.com> 2.68.3-10
|
||||
- Empty commit for rpmautospec -3
|
||||
|
||||
* Tue Jul 27 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.3-3
|
||||
- Fix build with glibc 2.34
|
||||
- Resolves: #1984626
|
||||
* Mon Jul 12 2021 Michael Catanzaro <mcatanzaro@redhat.com> 2.68.3-9
|
||||
- Empty commit for rpmautospec -2
|
||||
|
||||
* Thu Jul 01 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.3-2
|
||||
* Thu Jul 01 2021 Michael Catanzaro <mcatanzaro@gnome.org> - 2.68.3-4
|
||||
- Refresh gnutls-hmac patchset to fix leaks in error path
|
||||
- Related: #1971823
|
||||
|
||||
* Mon Jun 28 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.3-1
|
||||
* Mon Jun 28 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.3-3
|
||||
- Drop Recommends: shared-mime-info (#1947897)
|
||||
- Remove old Conflicts: gcr < 3.28.1
|
||||
|
||||
* Wed Jun 23 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.3-2
|
||||
- Drop check-rpath hack, no longer required
|
||||
|
||||
* Mon Jun 21 2021 Kalev Lember <klember@redhat.com> - 2.68.3-1
|
||||
- Update to 2.68.3
|
||||
- Resolves: #1976713
|
||||
- Remove Recommends: shared-mime-info
|
||||
- Resolves: #1947897
|
||||
|
||||
* Wed Jun 23 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.2-2
|
||||
- Update GHmac patchset and reenable glib2-static
|
||||
- Resolves: #1971823
|
||||
* Thu Jun 17 2021 Stephen Gallagher <sgallagh@redhat.com> - 2.68.2-3
|
||||
- Fix the requirement for 32-bit libgnutls.so.30
|
||||
|
||||
* Wed May 19 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.2-1
|
||||
* Thu Jun 17 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.2-2
|
||||
- Enable GnuTLS-based GHmac in Fedora and reenable glib2-static in RHEL
|
||||
- Consolidate GDesktopAppInfo changes into gdesktopappinfo.patch
|
||||
- Disable check-rpath since it seems to be broken
|
||||
|
||||
* Tue May 11 2021 Kalev Lember <klember@redhat.com> - 2.68.2-1
|
||||
- Update to 2.68.2
|
||||
- Resolves: #1961039
|
||||
|
||||
* Tue May 11 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.1-4
|
||||
- No changes, bump revision to retry gating
|
||||
- Related: #1951126
|
||||
|
||||
* Fri May 07 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.1-3
|
||||
* Wed May 05 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.1-3
|
||||
- Add missing bundled provides
|
||||
- Add rpminspect gating configuration
|
||||
- Consolidate GDesktopAppInfo patchset
|
||||
- Resolves: #1951126
|
||||
|
||||
* Wed Apr 28 2021 Michael Catanzaro <mcatanzaro@redhat.com> - 2.68.1-2
|
||||
- Refresh GDesktopAppInfo patchset
|
||||
- Related: #1951126
|
||||
|
||||
* Thu Apr 22 2021 Kalev Lember <klember@redhat.com> - 2.68.1-1
|
||||
* Thu Apr 08 2021 Kalev Lember <klember@redhat.com> - 2.68.1-1
|
||||
- Update to 2.68.1
|
||||
|
||||
* Thu Apr 15 2021 Mohan Boddu <mboddu@redhat.com> - 2.68.0-3
|
||||
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
|
||||
|
||||
* Fri Mar 26 2021 Kalev Lember <klember@redhat.com> - 2.68.0-2
|
||||
- Rebuild to fix sysprof-capture symbols leaking into libraries consuming it
|
||||
|
||||
|
@ -1016,3 +984,4 @@ Disable LTO
|
|||
* Thu Nov 08 2012 Kalev Lember <kalevlember@gmail.com> - 2.35.1-1
|
||||
- Update to 2.35.1
|
||||
- Drop upstreamed codegen-in-datadir.patch
|
||||
|
||||
|
|
Loading…
Reference in New Issue