aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-10-06 10:51:01 +0200
committerAleksander Morgado <aleksander@aleksander.es>2017-10-06 10:51:01 +0200
commitefaa780de20d0631f978781109900739f36126f0 (patch)
tree662c22a05a2d0964a8705aa2e62f7e6826b66ea2
parentfd2bfb7e85f1924f70c50b7e0d21ef5fe3caef38 (diff)
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]: <debug> [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)
-rw-r--r--src/mm-port-qmi.c23
1 files 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,