port-serial: un-schedule flash operation as soon as it's cancelled
When a flash operation is started, it is always scheduled in an idle. If this operation is cancelled, we should right away un-schedule it, otherwise we may end up calling flash_do() with the GTask in the private info already gone. See https://gitlab.freedesktop.org/mobile-broadband/ModemManager/merge_requests/178#note_330017
This commit is contained in:
@@ -1744,18 +1744,28 @@ flash_cancel_cb (GTask *task)
|
||||
void
|
||||
mm_port_serial_flash_cancel (MMPortSerial *self)
|
||||
{
|
||||
FlashContext *ctx;
|
||||
GTask *task;
|
||||
|
||||
/* Do nothing if there is no flash task */
|
||||
if (!self->priv->flash_task)
|
||||
return;
|
||||
|
||||
/* Recover task and schedule it to be cancelled in an idle.
|
||||
/* Recover task */
|
||||
task = self->priv->flash_task;
|
||||
self->priv->flash_task = NULL;
|
||||
|
||||
/* If flash operation is scheduled, unschedule it */
|
||||
ctx = g_task_get_task_data (task);
|
||||
if (ctx->flash_id) {
|
||||
g_source_remove (ctx->flash_id);
|
||||
ctx->flash_id = 0;
|
||||
}
|
||||
|
||||
/* Schedule task to be cancelled in an idle.
|
||||
* We do NOT want this cancellation to happen right away,
|
||||
* because the object reference in the flashing task may
|
||||
* be the last one valid. */
|
||||
task = self->priv->flash_task;
|
||||
self->priv->flash_task = NULL;
|
||||
g_idle_add ((GSourceFunc)flash_cancel_cb, task);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user