summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2016-07-28 11:21:29 +0200
committerLubomir Rintel <lkundrak@v3.sk>2016-07-28 11:22:31 +0200
commitba45b5ac6f8b3521e5487ac9c1385b33d07e334b (patch)
treec3c581b6f2cd2272e8b71c81aab67154307c7eaf
parent9446481f4cc06c657d9467bce0921a85bb94ae6b (diff)
downloadNetworkManager-ba45b5ac6f8b3521e5487ac9c1385b33d07e334b.tar.gz
cli: take a reference to the device when activating
It can go away before the activation finishes: (process:378): GLib-GObject-WARNING **: instance with invalid (NULL) class pointer Thread 1 "lt-nmcli" received signal SIGTRAP, Trace/breakpoint trap. 0x00007ffff4fa919b in g_logv () from /lib64/libglib-2.0.so.0 (gdb) bt #0 0x00007ffff4fa919b in g_logv () at /lib64/libglib-2.0.so.0 #1 0x00007ffff4fa930f in g_log () at /lib64/libglib-2.0.so.0 #2 0x00007ffff529b3ea in g_type_check_instance () at /lib64/libgobject-2.0.so.0 #3 0x00007ffff528fa94 in g_signal_handlers_disconnect_matched () at /lib64/libgobject-2.0.so.0 #4 0x000000000041ae4e in activate_connection_info_finish (info=0x7b5490) at connections.c:2197 #5 0x00007ffff5279470 in g_cclosure_marshal_VOID__OBJECTv () at /lib64/libgobject-2.0.so.0 #6 0x00007ffff5276617 in _g_closure_invoke_va () at /lib64/libgobject-2.0.so.0 #7 0x00007ffff5290ea9 in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0 #8 0x00007ffff52914ff in g_signal_emit () at /lib64/libgobject-2.0.so.0 #9 0x00007ffff52763e8 in g_closure_invoke () at /lib64/libgobject-2.0.so.0 #10 0x00007ffff52884a2 in signal_emit_unlocked_R () at /lib64/libgobject-2.0.so.0 #11 0x00007ffff529112d in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0 #12 0x00007ffff52919ab in g_signal_emit_by_name () at /lib64/libgobject-2.0.so.0 #13 0x00007ffff78fc9b1 in deferred_notify_cb (data=<optimized out>) at nm-object.c:243 #14 0x00007ffff4fa2703 in g_main_context_dispatch () at /lib64/libglib-2.0.so.0 #15 0x00007ffff4fa2ab0 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0 #16 0x00007ffff4fa2dd2 in g_main_loop_run () at /lib64/libglib-2.0.so.0 #17 0x00000000004146e3 in main (argc=<optimized out>, argv=<optimized out>) at nmcli.c:618 (gdb) print info->device
-rw-r--r--clients/cli/connections.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/clients/cli/connections.c b/clients/cli/connections.c
index 80ca1cde47..10b7df77f2 100644
--- a/clients/cli/connections.c
+++ b/clients/cli/connections.c
@@ -2193,8 +2193,11 @@ progress_vpn_cb (gpointer user_data)
static void
activate_connection_info_finish (ActivateConnectionInfo *info)
{
- if (info->device)
+ if (info->device) {
g_signal_handlers_disconnect_by_func (info->device, G_CALLBACK (device_state_cb), info);
+ g_object_unref (info->device);
+ }
+
if (info->active) {
if (NM_IS_VPN_CONNECTION (info->active))
g_signal_handlers_disconnect_by_func (info->active, G_CALLBACK (vpn_connection_state_cb), info);
@@ -2233,7 +2236,9 @@ activate_connection_cb (GObject *client, GAsyncResult *result, gpointer user_dat
if (!device) {
/* device could be NULL for virtual devices. Fill it here. */
ac_devs = nm_active_connection_get_devices (active);
- info->device = device = ac_devs->len > 0 ? g_ptr_array_index (ac_devs, 0) : NULL;
+ device = ac_devs->len > 0 ? g_ptr_array_index (ac_devs, 0) : NULL;
+ if (device)
+ info->device = g_object_ref (device);
}
if (nmc->nowait_flag || state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
@@ -2430,7 +2435,8 @@ nmc_activate_connection (NmCli *nmc,
info = g_malloc0 (sizeof (ActivateConnectionInfo));
info->nmc = nmc;
- info->device = device;
+ if (device)
+ info->device = g_object_ref (device);
nm_client_activate_connection_async (nmc->client,
connection,