diff options
author | Matthias Clasen <mclasen@redhat.com> | 2017-07-01 20:14:15 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2017-07-01 20:14:15 -0400 |
commit | 990ec6816af235f387f7105c6b2f4bfd09c6c21b (patch) | |
tree | 3e9e09493366e343dc0dc450317fe225cbbb626d | |
parent | 18211637ec71c7355c41e20fac14a280b2d01c3c (diff) | |
download | gtk+-portal-race.tar.gz |
Avoid a race in the print portalportal-race
Same as the previous commit; use the new predictable request
object path to connect to the Response signal early.
-rw-r--r-- | gtk/gtkprintoperation-portal.c | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/gtk/gtkprintoperation-portal.c b/gtk/gtkprintoperation-portal.c index 1272767ce9..aea974d7e2 100644 --- a/gtk/gtkprintoperation-portal.c +++ b/gtk/gtkprintoperation-portal.c @@ -53,6 +53,7 @@ typedef struct { GVariant *settings; GVariant *setup; GVariant *options; + char *prepare_print_handle; } PortalData; static void @@ -70,7 +71,7 @@ portal_data_free (gpointer data) g_variant_unref (portal->setup); if (portal->options) g_variant_unref (portal->options); - + g_free (portal->prepare_print_handle); g_free (portal); } @@ -453,16 +454,23 @@ prepare_print_called (GObject *source, else g_variant_get (ret, "(&o)", &handle); - portal->response_signal_id = - g_dbus_connection_signal_subscribe (g_dbus_proxy_get_connection (G_DBUS_PROXY (portal->proxy)), - "org.freedesktop.portal.Desktop", - "org.freedesktop.portal.Request", - "Response", - handle, - NULL, - G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE, - prepare_print_response, - portal, NULL); + if (strcmp (portal->prepare_print_handle, handle) != 0) + { + g_free (portal->prepare_print_handle); + portal->prepare_print_handle = g_strdup (handle); + g_dbus_connection_signal_unsubscribe (g_dbus_proxy_get_connection (G_DBUS_PROXY (portal->proxy)), + portal->response_signal_id); + portal->response_signal_id = + g_dbus_connection_signal_subscribe (g_dbus_proxy_get_connection (G_DBUS_PROXY (portal->proxy)), + "org.freedesktop.portal.Desktop", + "org.freedesktop.portal.Request", + "Response", + handle, + NULL, + G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE, + prepare_print_response, + portal, NULL); + } g_variant_unref (ret); } @@ -547,8 +555,32 @@ call_prepare_print (GtkPrintOperation *op, { GtkPrintOperationPrivate *priv = op->priv; GVariantBuilder opt_builder; + char *token; + char *sender; + int i; + + token = g_strdup_printf ("gtk%d", g_random_int ()); + sender = g_strdup (g_dbus_connection_get_unique_name (g_dbus_proxy_get_connection (portal->proxy)) + 1); + for (i = 0; sender[i]; i++) + if (sender[i] == '.') + sender[i] = '_'; + + portal->prepare_print_handle = g_strdup_printf ("/org/fredesktop/portal/desktop/request/%s/%s", sender, token); + g_free (sender); + + portal->response_signal_id = + g_dbus_connection_signal_subscribe (g_dbus_proxy_get_connection (G_DBUS_PROXY (portal->proxy)), + "org.freedesktop.portal.Desktop", + "org.freedesktop.portal.Request", + "Response", + portal->prepare_print_handle, + NULL, + G_DBUS_SIGNAL_FLAGS_NO_MATCH_RULE, + prepare_print_response, + portal, NULL); g_variant_builder_init (&opt_builder, G_VARIANT_TYPE_VARDICT); + g_variant_builder_add (&opt_builder, "{sv}", "token", g_variant_new_string (token)); portal->options = g_variant_builder_end (&opt_builder); if (priv->print_settings) |