From efaa780de20d0631f978781109900739f36126f0 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Fri, 6 Oct 2017 10:51:01 +0200 Subject: [PATCH] port-qmi: don't allow client allocation if port is closed The internal QmiDevice will be gone when the port is closed, so we cannot really do anything. This avoid an issue happening when the modem goes away in the middle of the client allocation logic performed by MMBroadbandModemQmi: ModemManager[24820]: [1507279407.225777] Couldn't allocate client for service 'wms': Couldn't create client for service 'wms': CID allocation failed in the CTL client: Transaction timed out ModemManager[24820]: qmi_device_allocate_client: assertion 'QMI_IS_DEVICE (self)' failed ==24820== ==24820== Process terminating with default action of signal 5 (SIGTRAP): dumping core ==24820== at 0x66E3411: ??? (in /usr/lib/libglib-2.0.so.0.5200.3) ==24820== by 0x66E46FA: g_logv (in /usr/lib/libglib-2.0.so.0.5200.3) ==24820== by 0x66E484E: g_log (in /usr/lib/libglib-2.0.so.0.5200.3) ==24820== by 0x538E259: qmi_device_allocate_client (qmi-device.c:1008) ==24820== by 0x1F5690: mm_port_qmi_allocate_client (mm-port-qmi.c:157) ==24820== by 0x1D20BA: allocate_next_client (mm-broadband-modem-qmi.c:11319) ==24820== by 0x1D2027: qmi_port_allocate_client_ready (mm-broadband-modem-qmi.c:11306) ==24820== by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3) ==24820== by 0x6130775: ??? (in /usr/lib/libgio-2.0.so.0.5200.3) ==24820== by 0x1F54E8: allocate_client_ready (mm-port-qmi.c:113) ==24820== by 0x612FD52: ??? (in /usr/lib/libgio-2.0.so.0.5200.3) ==24820== by 0x6130775: ??? (in /usr/lib/libgio-2.0.so.0.5200.3) --- src/mm-port-qmi.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c index 5810e095..e2f63054 100644 --- a/src/mm-port-qmi.c +++ b/src/mm-port-qmi.c @@ -132,15 +132,20 @@ mm_port_qmi_allocate_client (MMPortQmi *self, AllocateClientContext *ctx; GTask *task; + task = g_task_new (self, cancellable, callback, user_data); + + if (!mm_port_qmi_is_open (self)) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, + "Port is closed"); + g_object_unref (task); + return; + } + if (!!mm_port_qmi_peek_client (self, service, flag)) { - g_task_report_new_error (self, - callback, - user_data, - mm_port_qmi_allocate_client, - MM_CORE_ERROR, - MM_CORE_ERROR_EXISTS, + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_EXISTS, "Client for service '%s' already allocated", qmi_service_get_string (service)); + g_object_unref (task); return; } @@ -148,11 +153,7 @@ mm_port_qmi_allocate_client (MMPortQmi *self, ctx->info = g_new0 (ServiceInfo, 1); ctx->info->service = service; ctx->info->flag = flag; - - task = g_task_new (self, cancellable, callback, user_data); - g_task_set_task_data (task, - ctx, - (GDestroyNotify)allocate_client_context_free); + g_task_set_task_data (task, ctx, (GDestroyNotify)allocate_client_context_free); qmi_device_allocate_client (self->priv->qmi_device, service,