network/wifi: Use cancellables for NM async operations
Our NM async callbacks already handle being cancelled and we already have a cancellable in the base NetObject class, we just weren't wiring it up to the async calls. Do that to prevent use after free crashes. https://bugzilla.gnome.org/show_bug.cgi?id=787010
This commit is contained in:
parent
ffb8dd6076
commit
338719a876
1 changed files with 19 additions and 9 deletions
|
@ -418,9 +418,10 @@ device_get_hotspot_security_details (NetDeviceWifi *device_wifi,
|
||||||
* We'll refresh the UI when secrets arrive.
|
* We'll refresh the UI when secrets arrive.
|
||||||
*/
|
*/
|
||||||
if (tmp_secret == NULL) {
|
if (tmp_secret == NULL) {
|
||||||
|
GCancellable *cancellable = net_object_get_cancellable (NET_OBJECT (device_wifi));
|
||||||
nm_remote_connection_get_secrets_async ((NMRemoteConnection*)c,
|
nm_remote_connection_get_secrets_async ((NMRemoteConnection*)c,
|
||||||
NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
|
NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
|
||||||
NULL,
|
cancellable,
|
||||||
get_secrets_cb,
|
get_secrets_cb,
|
||||||
device_wifi);
|
device_wifi);
|
||||||
return;
|
return;
|
||||||
|
@ -737,6 +738,7 @@ wireless_try_to_connect (NetDeviceWifi *device_wifi,
|
||||||
NMDevice *device;
|
NMDevice *device;
|
||||||
NMSettingWireless *setting_wireless;
|
NMSettingWireless *setting_wireless;
|
||||||
NMClient *client;
|
NMClient *client;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
|
||||||
if (device_wifi->priv->updating_device)
|
if (device_wifi->priv->updating_device)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -777,12 +779,13 @@ wireless_try_to_connect (NetDeviceWifi *device_wifi,
|
||||||
|
|
||||||
/* activate the connection */
|
/* activate the connection */
|
||||||
client = net_object_get_client (NET_OBJECT (device_wifi));
|
client = net_object_get_client (NET_OBJECT (device_wifi));
|
||||||
|
cancellable = net_object_get_cancellable (NET_OBJECT (device_wifi));
|
||||||
if (connection_activate != NULL) {
|
if (connection_activate != NULL) {
|
||||||
nm_client_activate_connection_async (client,
|
nm_client_activate_connection_async (client,
|
||||||
connection_activate,
|
connection_activate,
|
||||||
device,
|
device,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
cancellable,
|
||||||
connection_activate_cb,
|
connection_activate_cb,
|
||||||
device_wifi);
|
device_wifi);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -817,7 +820,7 @@ wireless_try_to_connect (NetDeviceWifi *device_wifi,
|
||||||
partial,
|
partial,
|
||||||
device,
|
device,
|
||||||
ap_object_path,
|
ap_object_path,
|
||||||
NULL,
|
cancellable,
|
||||||
connection_add_activate_cb,
|
connection_add_activate_cb,
|
||||||
device_wifi);
|
device_wifi);
|
||||||
if (!allowed_to_share)
|
if (!allowed_to_share)
|
||||||
|
@ -1071,6 +1074,7 @@ overwrite_ssid_cb (GObject *source_object,
|
||||||
NMDevice *device;
|
NMDevice *device;
|
||||||
NMConnection *c;
|
NMConnection *c;
|
||||||
NetDeviceWifi *device_wifi;
|
NetDeviceWifi *device_wifi;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
|
||||||
connection = NM_REMOTE_CONNECTION (source_object);
|
connection = NM_REMOTE_CONNECTION (source_object);
|
||||||
|
|
||||||
|
@ -1085,6 +1089,7 @@ overwrite_ssid_cb (GObject *source_object,
|
||||||
device_wifi = user_data;
|
device_wifi = user_data;
|
||||||
device = net_device_get_nm_device (NET_DEVICE (device_wifi));
|
device = net_device_get_nm_device (NET_DEVICE (device_wifi));
|
||||||
client = net_object_get_client (NET_OBJECT (device_wifi));
|
client = net_object_get_client (NET_OBJECT (device_wifi));
|
||||||
|
cancellable = net_object_get_cancellable (NET_OBJECT (device_wifi));
|
||||||
c = net_device_wifi_get_hotspot_connection (device_wifi);
|
c = net_device_wifi_get_hotspot_connection (device_wifi);
|
||||||
|
|
||||||
g_debug ("activate existing hotspot connection\n");
|
g_debug ("activate existing hotspot connection\n");
|
||||||
|
@ -1092,7 +1097,7 @@ overwrite_ssid_cb (GObject *source_object,
|
||||||
c,
|
c,
|
||||||
device,
|
device,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
cancellable,
|
||||||
activate_cb,
|
activate_cb,
|
||||||
device_wifi);
|
device_wifi);
|
||||||
}
|
}
|
||||||
|
@ -1112,6 +1117,7 @@ start_shared_connection (NetDeviceWifi *device_wifi)
|
||||||
NMClient *client;
|
NMClient *client;
|
||||||
const char *mode;
|
const char *mode;
|
||||||
NMDeviceWifiCapabilities caps;
|
NMDeviceWifiCapabilities caps;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
|
||||||
device = net_device_get_nm_device (NET_DEVICE (device_wifi));
|
device = net_device_get_nm_device (NET_DEVICE (device_wifi));
|
||||||
g_assert (nm_device_get_device_type (device) == NM_DEVICE_TYPE_WIFI);
|
g_assert (nm_device_get_device_type (device) == NM_DEVICE_TYPE_WIFI);
|
||||||
|
@ -1121,6 +1127,7 @@ start_shared_connection (NetDeviceWifi *device_wifi)
|
||||||
ssid = generate_ssid_for_hotspot (device_wifi);
|
ssid = generate_ssid_for_hotspot (device_wifi);
|
||||||
|
|
||||||
client = net_object_get_client (NET_OBJECT (device_wifi));
|
client = net_object_get_client (NET_OBJECT (device_wifi));
|
||||||
|
cancellable = net_object_get_cancellable (NET_OBJECT (device_wifi));
|
||||||
if (c != NULL) {
|
if (c != NULL) {
|
||||||
NMSettingWireless *sw;
|
NMSettingWireless *sw;
|
||||||
const char *c_path;
|
const char *c_path;
|
||||||
|
@ -1137,7 +1144,7 @@ start_shared_connection (NetDeviceWifi *device_wifi)
|
||||||
|
|
||||||
nm_remote_connection_commit_changes_async (connection,
|
nm_remote_connection_commit_changes_async (connection,
|
||||||
TRUE,
|
TRUE,
|
||||||
NULL,
|
cancellable,
|
||||||
overwrite_ssid_cb,
|
overwrite_ssid_cb,
|
||||||
device_wifi);
|
device_wifi);
|
||||||
return;
|
return;
|
||||||
|
@ -1215,7 +1222,7 @@ start_shared_connection (NetDeviceWifi *device_wifi)
|
||||||
c,
|
c,
|
||||||
device,
|
device,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
cancellable,
|
||||||
activate_new_cb,
|
activate_new_cb,
|
||||||
device_wifi);
|
device_wifi);
|
||||||
|
|
||||||
|
@ -1596,6 +1603,7 @@ really_forget (GtkDialog *dialog, gint response, gpointer data)
|
||||||
GList *r;
|
GList *r;
|
||||||
NMRemoteConnection *connection;
|
NMRemoteConnection *connection;
|
||||||
NetDeviceWifi *device_wifi;
|
NetDeviceWifi *device_wifi;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
|
||||||
gtk_widget_destroy (GTK_WIDGET (dialog));
|
gtk_widget_destroy (GTK_WIDGET (dialog));
|
||||||
|
|
||||||
|
@ -1603,12 +1611,12 @@ really_forget (GtkDialog *dialog, gint response, gpointer data)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
device_wifi = NET_DEVICE_WIFI (g_object_get_data (G_OBJECT (forget), "net"));
|
device_wifi = NET_DEVICE_WIFI (g_object_get_data (G_OBJECT (forget), "net"));
|
||||||
|
cancellable = net_object_get_cancellable (NET_OBJECT (device_wifi));
|
||||||
rows = g_object_steal_data (G_OBJECT (forget), "rows");
|
rows = g_object_steal_data (G_OBJECT (forget), "rows");
|
||||||
for (r = rows; r; r = r->next) {
|
for (r = rows; r; r = r->next) {
|
||||||
row = r->data;
|
row = r->data;
|
||||||
connection = g_object_get_data (G_OBJECT (row), "connection");
|
connection = g_object_get_data (G_OBJECT (row), "connection");
|
||||||
//FIXME cancellable
|
nm_remote_connection_delete_async (connection, cancellable, really_forgotten, device_wifi);
|
||||||
nm_remote_connection_delete_async (connection, NULL, really_forgotten, device_wifi);
|
|
||||||
gtk_widget_destroy (row);
|
gtk_widget_destroy (row);
|
||||||
}
|
}
|
||||||
g_list_free (rows);
|
g_list_free (rows);
|
||||||
|
@ -2125,6 +2133,7 @@ ap_activated (GtkListBox *list, GtkListBoxRow *row, NetDeviceWifi *device_wifi)
|
||||||
NMDevice *nm_device;
|
NMDevice *nm_device;
|
||||||
GtkWidget *edit;
|
GtkWidget *edit;
|
||||||
GtkWidget *stack;
|
GtkWidget *stack;
|
||||||
|
GCancellable *cancellable;
|
||||||
|
|
||||||
connection = NM_CONNECTION (g_object_get_data (G_OBJECT (row), "connection"));
|
connection = NM_CONNECTION (g_object_get_data (G_OBJECT (row), "connection"));
|
||||||
ap = NM_ACCESS_POINT (g_object_get_data (G_OBJECT (row), "ap"));
|
ap = NM_ACCESS_POINT (g_object_get_data (G_OBJECT (row), "ap"));
|
||||||
|
@ -2137,9 +2146,10 @@ ap_activated (GtkListBox *list, GtkListBoxRow *row, NetDeviceWifi *device_wifi)
|
||||||
gtk_widget_hide (edit);
|
gtk_widget_hide (edit);
|
||||||
client = net_object_get_client (NET_OBJECT (device_wifi));
|
client = net_object_get_client (NET_OBJECT (device_wifi));
|
||||||
nm_device = net_device_get_nm_device (NET_DEVICE (device_wifi));
|
nm_device = net_device_get_nm_device (NET_DEVICE (device_wifi));
|
||||||
|
cancellable = net_object_get_cancellable (NET_OBJECT (device_wifi));
|
||||||
nm_client_activate_connection_async (client,
|
nm_client_activate_connection_async (client,
|
||||||
connection,
|
connection,
|
||||||
nm_device, NULL, NULL,
|
nm_device, NULL, cancellable,
|
||||||
connection_activate_cb, device_wifi);
|
connection_activate_cb, device_wifi);
|
||||||
} else {
|
} else {
|
||||||
GBytes *ssid;
|
GBytes *ssid;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue