From 4a639d92a6f1a5dd8f59d57ade37d4cff420b66a Mon Sep 17 00:00:00 2001 From: William Jon McCann Date: Tue, 13 Mar 2007 11:41:31 -0400 Subject: various leak fixes --- src/ck-manager.c | 38 +++++++++++++++++++++++++++++++++++--- src/ck-seat.c | 15 +++++++++++---- src/ck-session.c | 32 +++++++++++++++++++------------- src/main.c | 4 +++- 4 files changed, 68 insertions(+), 21 deletions(-) diff --git a/src/ck-manager.c b/src/ck-manager.c index 9b51000..8e66419 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -375,6 +375,11 @@ find_seat_for_session (CkManager *manager, g_free (sid); } + g_free (display_device); + g_free (x11_display_device); + g_free (x11_display); + g_free (remote_host_name); + return seat; } @@ -627,6 +632,8 @@ add_param_int (GPtrArray *parameters, 0, key, 1, &val, G_MAXUINT); + g_value_unset (&val); + g_ptr_array_add (parameters, g_value_get_boxed (¶m_val)); } @@ -654,6 +661,8 @@ add_param_boolean (GPtrArray *parameters, 0, key, 1, &val, G_MAXUINT); + g_value_unset (&val); + g_ptr_array_add (parameters, g_value_get_boxed (¶m_val)); } @@ -676,6 +685,8 @@ add_param_string (GPtrArray *parameters, 0, key, 1, &val, G_MAXUINT); + g_value_unset (&val); + g_ptr_array_add (parameters, g_value_get_boxed (¶m_val)); } @@ -716,6 +727,7 @@ parse_output (const char *output) vals = g_strsplit (lines[i], " = ", 2); if (vals == NULL || vals[0] == NULL) { + g_strfreev (vals); continue; } @@ -728,6 +740,8 @@ parse_output (const char *output) g_strfreev (vals); } + g_strfreev (lines); + return parameters; } @@ -744,6 +758,22 @@ job_data_free (JobData *data) g_free (data); } +static void +parameters_free (GPtrArray *parameters) +{ + int i; + + for (i = 0; i < parameters->len; i++) { + gpointer data; + data = g_ptr_array_index (parameters, i); + if (data != NULL) { + g_boxed_free (CK_TYPE_PARAMETER_STRUCT, data); + } + } + + g_ptr_array_free (parameters, TRUE); +} + static void job_completed (CkJob *job, int status, @@ -765,9 +795,7 @@ job_completed (CkJob *job, data->leader_info, parameters, data->context); - - g_ptr_array_free (parameters, TRUE); - + parameters_free (parameters); } /* remove job from queue */ @@ -886,6 +914,9 @@ create_session_for_sender (CkManager *manager, context); } + g_free (cookie); + g_free (ssid); + return TRUE; } @@ -1192,6 +1223,7 @@ remove_session_for_cookie (CkManager *manager, g_hash_table_remove (manager->priv->sessions, ssid); + g_free (sid); g_free (ssid); manager_update_system_idle_hint (manager); diff --git a/src/ck-seat.c b/src/ck-seat.c index c980ad5..0b8ef80 100644 --- a/src/ck-seat.c +++ b/src/ck-seat.c @@ -527,10 +527,12 @@ ck_seat_remove_session (CkSeat *seat, CkSession *session, GError **error) { - char *ssid; + char *ssid; + gboolean ret; g_return_val_if_fail (CK_IS_SEAT (seat), FALSE); + ret = FALSE; ssid = NULL; ck_session_get_id (session, &ssid, NULL); @@ -540,8 +542,7 @@ ck_seat_remove_session (CkSeat *seat, CK_SEAT_ERROR, CK_SEAT_ERROR_GENERAL, _("Session is not attached to this seat")); - g_free (ssid); - return FALSE; + goto out; } g_signal_handlers_disconnect_by_func (session, session_activate, seat); @@ -555,7 +556,11 @@ ck_seat_remove_session (CkSeat *seat, /* try to change the active session */ maybe_update_active_session (seat); - return TRUE; + ret = TRUE; + out: + g_free (ssid); + + return ret; } gboolean @@ -582,6 +587,8 @@ ck_seat_add_session (CkSeat *seat, maybe_update_active_session (seat); + g_free (ssid); + return TRUE; } diff --git a/src/ck-session.c b/src/ck-session.c index e513bc3..c88cbbc 100644 --- a/src/ck-session.c +++ b/src/ck-session.c @@ -1064,6 +1064,8 @@ ck_session_finalize (GObject *object) g_free (session->priv->seat_id); g_free (session->priv->session_type); g_free (session->priv->x11_display); + g_free (session->priv->display_device); + g_free (session->priv->x11_display_device); g_free (session->priv->remote_host_name); G_OBJECT_CLASS (ck_session_parent_class)->finalize (object); @@ -1119,13 +1121,13 @@ ck_session_new_with_parameters (const char *ssid, params = g_new0 (GParameter, n_allocated_params); n_params = 0; - params[n_params].name = "id"; + params[n_params].name = g_strdup ("id"); params[n_params].value.g_type = 0; g_value_init (¶ms[n_params].value, G_TYPE_STRING); g_value_set_string (¶ms[n_params].value, ssid); n_params++; - params[n_params].name = "cookie"; + params[n_params].name = g_strdup ("cookie"); params[n_params].value.g_type = 0; g_value_init (¶ms[n_params].value, G_TYPE_STRING); g_value_set_string (¶ms[n_params].value, cookie); @@ -1135,7 +1137,7 @@ ck_session_new_with_parameters (const char *ssid, for (i = 0; i < parameters->len; i++) { gboolean res; GValue val_struct = { 0, }; - const char *prop_name; + char *prop_name; GValue *prop_val; GParamSpec *pspec; @@ -1148,50 +1150,54 @@ ck_session_new_with_parameters (const char *ssid, G_MAXUINT); if (! res) { ck_debug ("Unable to extract parameter input"); - continue; + goto cont; } if (prop_name == NULL) { ck_debug ("Skipping NULL parameter"); - continue; + goto cont; } if (strcmp (prop_name, "id") == 0 || strcmp (prop_name, "cookie") == 0) { ck_debug ("Skipping restricted parameter: %s", prop_name); - continue; + goto cont; } pspec = g_object_class_find_property (class, prop_name); if (! pspec) { ck_debug ("Skipping unknown parameter: %s", prop_name); - if (prop_val != NULL) { - g_value_unset (prop_val); - } - continue; + goto cont; } if (!(pspec->flags & G_PARAM_WRITABLE)) { ck_debug ("property '%s' is not writable", pspec->name); - continue; + goto cont; } - params[n_params].name = prop_name; + params[n_params].name = g_strdup (prop_name); params[n_params].value.g_type = 0; g_value_init (¶ms[n_params].value, G_PARAM_SPEC_VALUE_TYPE (pspec)); res = g_value_transform (prop_val, ¶ms[n_params].value); if (! res) { ck_debug ("unable to transform property value for '%s'", pspec->name); - continue; + goto cont; } n_params++; + cont: + g_free (prop_name); + if (prop_val != NULL) { + g_value_unset (prop_val); + g_free (prop_val); + } } } object = g_object_newv (object_type, n_params, params); while (n_params--) { + g_free ((char *)params[n_params].name); g_value_unset (¶ms[n_params].value); } g_free (params); diff --git a/src/main.c b/src/main.c index 3035b31..446b291 100644 --- a/src/main.c +++ b/src/main.c @@ -285,13 +285,15 @@ main (int argc, loop = g_main_loop_new (NULL, FALSE); if (do_timed_exit) { - g_timeout_add (3000 * 60, (GSourceFunc) timed_exit_cb, loop); + g_timeout_add (1000 * 30, (GSourceFunc) timed_exit_cb, loop); } g_main_loop_run (loop); g_object_unref (manager); + g_main_loop_unref (loop); + ret = 0; out: -- cgit