diff options
author | Jiří Klimeš <jklimes@redhat.com> | 2014-12-03 13:19:37 +0100 |
---|---|---|
committer | Jiří Klimeš <jklimes@redhat.com> | 2014-12-03 13:22:29 +0100 |
commit | 1a4259d23af7f645f9bc78725e88506564961090 (patch) | |
tree | 2d4be01707d79ca0b00bc2ccb3de1cc9d587c111 | |
parent | 4a7c88621ddd8e8089f63071e3114003a0efc622 (diff) | |
download | NetworkManager-1a4259d23af7f645f9bc78725e88506564961090.tar.gz |
cli: additional fix for nmcli connection down
nmcli crashed when a timeout was hit, because 'info' was used after freeing
in down_timeout_cb().
Fixes 4a7c88621ddd8e8089f63071e3114003a0efc622.
-rw-r--r-- | clients/cli/connections.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c index c0e48e3552..ca383227ff 100644 --- a/clients/cli/connections.c +++ b/clients/cli/connections.c @@ -2249,10 +2249,6 @@ down_timeout_cb (gpointer user_data) { DeactivateConnectionInfo *info = user_data; - while (info->queue) - deactivate_connection_info_finish (info, info->queue->data); - - info->timeout_id = 0; timeout_cb (info->nmc); deactivate_connection_info_finish (info, NULL); return G_SOURCE_REMOVE; @@ -2275,15 +2271,26 @@ down_active_connection_state_cb (NMActiveConnection *active, } static void +destroy_queue_element (gpointer data) +{ + g_signal_handlers_disconnect_matched (data, G_SIGNAL_MATCH_FUNC, 0, 0, 0, + down_active_connection_state_cb, NULL); + g_object_unref (data); +} + +static void deactivate_connection_info_finish (DeactivateConnectionInfo *info, NMActiveConnection *active) { if (active) { info->queue = g_slist_remove (info->queue, active); g_signal_handlers_disconnect_by_func (active, - down_active_connection_state_cb, - info); + down_active_connection_state_cb, + info); g_object_unref (active); + } else { + g_slist_free_full (info->queue, destroy_queue_element); + info->queue = NULL; } if (info->queue) |