device: take reference to device object before 'delete_on_deactivate'

It's not clear why currently a weak reference is needed.
This commit is contained in:
Beniamino Galvani
2021-04-21 13:42:45 +02:00
parent 9eac9c846c
commit a42682d44f

View File

@@ -125,7 +125,6 @@ typedef struct {
typedef struct { typedef struct {
NMDevice *device; NMDevice *device;
guint idle_add_id; guint idle_add_id;
int ifindex;
} DeleteOnDeactivateData; } DeleteOnDeactivateData;
typedef struct { typedef struct {
@@ -12169,28 +12168,19 @@ nm_device_is_nm_owned(NMDevice *self)
static gboolean static gboolean
delete_on_deactivate_link_delete(gpointer user_data) delete_on_deactivate_link_delete(gpointer user_data)
{ {
DeleteOnDeactivateData *data = user_data; DeleteOnDeactivateData *data = user_data;
NMDevice * self = data->device; nm_auto_unref_object NMDevice *self = data->device;
NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self);
gs_free_error GError *error = NULL;
_LOGD(LOGD_DEVICE, _LOGD(LOGD_DEVICE,
"delete_on_deactivate: cleanup and delete virtual link #%d (id=%u)", "delete_on_deactivate: cleanup and delete virtual link (id=%u)",
data->ifindex,
data->idle_add_id); data->idle_add_id);
if (data->device) { priv->delete_on_deactivate_data = NULL;
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(data->device);
gs_free_error GError *error = NULL;
g_object_remove_weak_pointer(G_OBJECT(data->device), (void **) &data->device); if (!nm_device_unrealize(self, TRUE, &error))
priv->delete_on_deactivate_data = NULL; _LOGD(LOGD_DEVICE, "delete_on_deactivate: unrealizing failed (%s)", error->message);
if (!nm_device_unrealize(data->device, TRUE, &error))
_LOGD(LOGD_DEVICE,
"delete_on_deactivate: unrealizing %d failed (%s)",
data->ifindex,
error->message);
} else if (data->ifindex > 0)
nm_platform_link_delete(nm_device_get_platform(self), data->ifindex);
nm_device_emit_recheck_auto_activate(self); nm_device_emit_recheck_auto_activate(self);
@@ -12209,17 +12199,16 @@ delete_on_deactivate_unschedule(NMDevice *self)
priv->delete_on_deactivate_data = NULL; priv->delete_on_deactivate_data = NULL;
g_source_remove(data->idle_add_id); g_source_remove(data->idle_add_id);
g_object_remove_weak_pointer(G_OBJECT(self), (void **) &data->device);
_LOGD(LOGD_DEVICE, _LOGD(LOGD_DEVICE,
"delete_on_deactivate: cancel cleanup and delete virtual link #%d (id=%u)", "delete_on_deactivate: cancel cleanup and delete virtual link (id=%u)",
data->ifindex,
data->idle_add_id); data->idle_add_id);
g_object_unref(data->device);
g_free(data); g_free(data);
} }
} }
static void static void
delete_on_deactivate_check_and_schedule(NMDevice *self, int ifindex) delete_on_deactivate_check_and_schedule(NMDevice *self)
{ {
NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self); NMDevicePrivate * priv = NM_DEVICE_GET_PRIVATE(self);
DeleteOnDeactivateData *data; DeleteOnDeactivateData *data;
@@ -12236,16 +12225,13 @@ delete_on_deactivate_check_and_schedule(NMDevice *self, int ifindex)
return; return;
delete_on_deactivate_unschedule(self); /* always cancel and reschedule */ delete_on_deactivate_unschedule(self); /* always cancel and reschedule */
data = g_new(DeleteOnDeactivateData, 1); data = g_new(DeleteOnDeactivateData, 1);
g_object_add_weak_pointer(G_OBJECT(self), (void **) &data->device); data->device = g_object_ref(self);
data->device = self;
data->ifindex = ifindex;
data->idle_add_id = g_idle_add(delete_on_deactivate_link_delete, data); data->idle_add_id = g_idle_add(delete_on_deactivate_link_delete, data);
priv->delete_on_deactivate_data = data; priv->delete_on_deactivate_data = data;
_LOGD(LOGD_DEVICE, _LOGD(LOGD_DEVICE,
"delete_on_deactivate: schedule cleanup and delete virtual link #%d (id=%u)", "delete_on_deactivate: schedule cleanup and delete virtual link (id=%u)",
ifindex,
data->idle_add_id); data->idle_add_id);
} }
@@ -15883,7 +15869,7 @@ _cleanup_generic_post(NMDevice *self, CleanupType cleanup_type)
/* Check if the device was deactivated, and if so, delete_link. /* Check if the device was deactivated, and if so, delete_link.
* Don't call delete_link synchronously because we are currently * Don't call delete_link synchronously because we are currently
* handling a state change -- which is not reentrant. */ * handling a state change -- which is not reentrant. */
delete_on_deactivate_check_and_schedule(self, nm_device_get_ip_ifindex(self)); delete_on_deactivate_check_and_schedule(self);
} }
/* ip_iface should be cleared after flushing all routes and addresses, since /* ip_iface should be cleared after flushing all routes and addresses, since