[gnome-software] Refactor autoptr handling to be safer.
- From: Robert Ancell <rancell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-software] Refactor autoptr handling to be safer.
- Date: Fri, 2 Feb 2018 03:51:23 +0000 (UTC)
commit b40169734248adccfd2c373a29062384582abb0d
Author: Robert Ancell <robert ancell canonical com>
Date: Fri Feb 2 16:39:47 2018 +1300
Refactor autoptr handling to be safer.
Using g_steal_pointer as a function parameter is dangerous - it might cause
another parameter to be NULL.
Remove explicit free calls by using g_auto more appropriately.
src/gs-details-page.c | 12 +++++----
src/gs-page.c | 69 +++++++++++++++++++++++++++++----------------------
2 files changed, 46 insertions(+), 35 deletions(-)
---
diff --git a/src/gs-details-page.c b/src/gs-details-page.c
index d508119a..2ac7b346 100644
--- a/src/gs-details-page.c
+++ b/src/gs-details-page.c
@@ -1202,17 +1202,17 @@ gs_details_page_app_set_review_cb (GObject *source,
static void
gs_details_page_authenticate_cb (GtkDialog *dialog,
GtkResponseType response_type,
- GsDetailsPageReviewHelper *helper)
+ gpointer user_data)
{
+ g_autoptr(GsDetailsPageReviewHelper) helper = (GsDetailsPageReviewHelper *) user_data;
g_autoptr(GsPluginJob) plugin_job = NULL;
/* unmap the dialog */
gtk_widget_destroy (GTK_WIDGET (dialog));
- if (response_type != GTK_RESPONSE_OK) {
- gs_details_page_review_helper_free (helper);
+ if (response_type != GTK_RESPONSE_OK)
return;
- }
+
plugin_job = gs_plugin_job_newv (helper->action,
"app", helper->app,
"review", helper->review,
@@ -1223,6 +1223,7 @@ gs_details_page_authenticate_cb (GtkDialog *dialog,
helper->self->cancellable,
gs_details_page_app_set_review_cb,
helper);
+ g_steal_pointer (&helper);
}
static void
@@ -1252,7 +1253,8 @@ gs_details_page_app_set_review_cb (GObject *source,
gs_shell_modal_dialog_present (helper->self->shell, GTK_DIALOG (dialog));
g_signal_connect (dialog, "response",
G_CALLBACK (gs_details_page_authenticate_cb),
- g_steal_pointer (&helper));
+ helper);
+ g_steal_pointer (&helper);
return;
}
g_warning ("failed to set review on %s: %s",
diff --git a/src/gs-page.c b/src/gs-page.c
index e075eac4..1549cc79 100644
--- a/src/gs-page.c
+++ b/src/gs-page.c
@@ -80,18 +80,18 @@ gs_page_app_installed_cb (GObject *source,
static void
gs_page_install_authenticate_cb (GtkDialog *dialog,
GtkResponseType response_type,
- GsPageHelper *helper)
+ gpointer user_data)
{
+ g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data;
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
g_autoptr(GsPluginJob) plugin_job = NULL;
/* unmap the dialog */
gtk_widget_destroy (GTK_WIDGET (dialog));
- if (response_type != GTK_RESPONSE_OK) {
- gs_page_helper_free (helper);
+ if (response_type != GTK_RESPONSE_OK)
return;
- }
+
plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_INSTALL,
"app", helper->app,
"failure-flags", GS_PLUGIN_FAILURE_FLAGS_USE_EVENTS,
@@ -100,6 +100,7 @@ gs_page_install_authenticate_cb (GtkDialog *dialog,
helper->cancellable,
gs_page_app_installed_cb,
helper);
+ g_steal_pointer (&helper);
}
static void
@@ -110,18 +111,18 @@ gs_page_app_removed_cb (GObject *source,
static void
gs_page_remove_authenticate_cb (GtkDialog *dialog,
GtkResponseType response_type,
- GsPageHelper *helper)
+ gpointer user_data)
{
+ g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data;
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
g_autoptr(GsPluginJob) plugin_job = NULL;
/* unmap the dialog */
gtk_widget_destroy (GTK_WIDGET (dialog));
- if (response_type != GTK_RESPONSE_OK) {
- gs_page_helper_free (helper);
+ if (response_type != GTK_RESPONSE_OK)
return;
- }
+
plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_REMOVE,
"app", helper->app,
NULL);
@@ -129,6 +130,7 @@ gs_page_remove_authenticate_cb (GtkDialog *dialog,
helper->cancellable,
gs_page_app_removed_cb,
helper);
+ g_steal_pointer (&helper);
}
static void
@@ -170,7 +172,8 @@ gs_page_app_installed_cb (GObject *source,
gs_shell_modal_dialog_present (priv->shell, GTK_DIALOG (dialog));
g_signal_connect (dialog, "response",
G_CALLBACK (gs_page_install_authenticate_cb),
- g_steal_pointer (&helper));
+ helper);
+ g_steal_pointer (&helper);
return;
}
@@ -232,7 +235,8 @@ gs_page_app_removed_cb (GObject *source,
gs_shell_modal_dialog_present (priv->shell, GTK_DIALOG (dialog));
g_signal_connect (dialog, "response",
G_CALLBACK (gs_page_remove_authenticate_cb),
- g_steal_pointer (&helper));
+ helper);
+ g_steal_pointer (&helper);
return;
}
@@ -286,18 +290,18 @@ gs_page_app_purchased_cb (GObject *source,
static void
gs_page_purchase_authenticate_cb (GtkDialog *dialog,
GtkResponseType response_type,
- GsPageHelper *helper)
+ gpointer user_data)
{
+ g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data;
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
g_autoptr(GsPluginJob) plugin_job = NULL;
/* unmap the dialog */
gtk_widget_destroy (GTK_WIDGET (dialog));
- if (response_type != GTK_RESPONSE_OK) {
- gs_page_helper_free (helper);
+ if (response_type != GTK_RESPONSE_OK)
return;
- }
+
plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_PURCHASE,
"app", helper->app,
"failure-flags", GS_PLUGIN_FAILURE_FLAGS_USE_EVENTS,
@@ -306,6 +310,7 @@ gs_page_purchase_authenticate_cb (GtkDialog *dialog,
helper->cancellable,
gs_page_app_purchased_cb,
helper);
+ g_steal_pointer (&helper);
}
static void
@@ -316,7 +321,6 @@ gs_page_app_purchased_cb (GObject *source,
g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data;
GsPluginLoader *plugin_loader = GS_PLUGIN_LOADER (source);
GsPage *page = helper->page;
- GCancellable *cancellable = helper->cancellable;
GsPagePrivate *priv = gs_page_get_instance_private (page);
gboolean ret;
g_autoptr(GsPluginJob) plugin_job = NULL;
@@ -349,7 +353,8 @@ gs_page_app_purchased_cb (GObject *source,
gs_shell_modal_dialog_present (priv->shell, GTK_DIALOG (dialog));
g_signal_connect (dialog, "response",
G_CALLBACK (gs_page_purchase_authenticate_cb),
- g_steal_pointer (&helper));
+ helper);
+ g_steal_pointer (&helper);
return;
}
@@ -372,16 +377,18 @@ gs_page_app_purchased_cb (GObject *source,
NULL);
gs_plugin_loader_job_process_async (priv->plugin_loader,
plugin_job,
- cancellable,
+ helper->cancellable,
gs_page_app_installed_cb,
- g_steal_pointer (&helper));
+ helper);
+ g_steal_pointer (&helper);
}
static void
gs_page_install_purchase_response_cb (GtkDialog *dialog,
gint response,
- GsPageHelper *helper)
+ gpointer user_data)
{
+ g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data;
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
g_autoptr(GsPluginJob) plugin_job = NULL;
@@ -389,10 +396,9 @@ gs_page_install_purchase_response_cb (GtkDialog *dialog,
gtk_widget_destroy (GTK_WIDGET (dialog));
/* not agreed */
- if (response != GTK_RESPONSE_OK) {
- gs_page_helper_free (helper);
+ if (response != GTK_RESPONSE_OK)
return;
- }
+
g_debug ("purchase %s", gs_app_get_id (helper->app));
plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_PURCHASE,
@@ -406,6 +412,7 @@ gs_page_install_purchase_response_cb (GtkDialog *dialog,
helper->cancellable,
gs_page_app_purchased_cb,
helper);
+ g_steal_pointer (&helper);
}
void
@@ -484,8 +491,9 @@ gs_page_install_app (GsPage *page,
static void
gs_page_update_app_response_cb (GtkDialog *dialog,
gint response,
- GsPageHelper *helper)
+ gpointer user_data)
{
+ g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data;
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
g_autoptr(GsPluginJob) plugin_job = NULL;
@@ -493,10 +501,9 @@ gs_page_update_app_response_cb (GtkDialog *dialog,
gtk_widget_destroy (GTK_WIDGET (dialog));
/* not agreed */
- if (response != GTK_RESPONSE_OK) {
- gs_page_helper_free (helper);
+ if (response != GTK_RESPONSE_OK)
return;
- }
+
g_debug ("update %s", gs_app_get_id (helper->app));
plugin_job = gs_plugin_job_newv (GS_PLUGIN_ACTION_UPDATE,
"app", helper->app,
@@ -506,6 +513,7 @@ gs_page_update_app_response_cb (GtkDialog *dialog,
helper->cancellable,
gs_page_app_installed_cb,
helper);
+ g_steal_pointer (&helper);
}
static void
@@ -609,8 +617,9 @@ gs_page_update_app (GsPage *page, GsApp *app, GCancellable *cancellable)
static void
gs_page_remove_app_response_cb (GtkDialog *dialog,
gint response,
- GsPageHelper *helper)
+ gpointer user_data)
{
+ g_autoptr(GsPageHelper) helper = (GsPageHelper *) user_data;
GsPagePrivate *priv = gs_page_get_instance_private (helper->page);
g_autoptr(GsPluginJob) plugin_job = NULL;
@@ -618,10 +627,9 @@ gs_page_remove_app_response_cb (GtkDialog *dialog,
gtk_widget_destroy (GTK_WIDGET (dialog));
/* not agreed */
- if (response != GTK_RESPONSE_OK) {
- gs_page_helper_free (helper);
+ if (response != GTK_RESPONSE_OK)
return;
- }
+
g_debug ("remove %s", gs_app_get_id (helper->app));
plugin_job = gs_plugin_job_newv (helper->action,
"app", helper->app,
@@ -630,6 +638,7 @@ gs_page_remove_app_response_cb (GtkDialog *dialog,
helper->cancellable,
gs_page_app_removed_cb,
helper);
+ g_steal_pointer (&helper);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]