aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-05-23 00:38:09 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-05-24 12:52:52 +0000
commit3da3623e11f90e45951118119da6f842053fd133 (patch)
tree0aa70687ba9ee225208cb6677b33e983e4aa49de /src
parent1f10b3ff7f2e9cf8a72859fc7340bc60bb189c2e (diff)
broadband-modem: check if skeleton exists when creating device id
The logic that creates the device identifier uses some fields that are exposed in DBus (e.g. model, manufacturer...). We should not attempt to load any of that info if the DBus skeleton for the Modem interface is no longer available, as e.g. the device may have gone away already. Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/374
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem-mbim.c16
-rw-r--r--src/mm-broadband-modem-qmi.c16
-rw-r--r--src/mm-broadband-modem.c36
-rw-r--r--src/mm-broadband-modem.h7
4 files changed, 49 insertions, 26 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 8c96545e..85e6501c 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -857,15 +857,19 @@ modem_load_device_identifier (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- gchar *device_identifier;
- GTask *task;
+ gchar *device_identifier;
+ GTask *task;
+ GError *error = NULL;
+
+ task = g_task_new (self, NULL, callback, user_data);
/* Just use dummy ATI/ATI1 replies, all the other internal info should be
* enough for uniqueness */
- device_identifier = mm_broadband_modem_create_device_identifier (MM_BROADBAND_MODEM (self), "", "");
-
- task = g_task_new (self, NULL, callback, user_data);
- g_task_return_pointer (task, device_identifier, g_free);
+ device_identifier = mm_broadband_modem_create_device_identifier (MM_BROADBAND_MODEM (self), "", "", &error);
+ if (!device_identifier)
+ g_task_return_error (task, error);
+ else
+ g_task_return_pointer (task, device_identifier, g_free);
g_object_unref (task);
}
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 12244b05..9b391098 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -679,17 +679,21 @@ modem_load_device_identifier (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- gchar *device_identifier;
- GTask *task;
+ gchar *device_identifier;
+ GTask *task;
+ GError *error = NULL;
+
+ task = g_task_new (self, NULL, callback, user_data);
mm_obj_dbg (self, "loading device identifier...");
/* Just use dummy ATI/ATI1 replies, all the other internal info should be
* enough for uniqueness */
- device_identifier = mm_broadband_modem_create_device_identifier (MM_BROADBAND_MODEM (self), "", "");
-
- task = g_task_new (self, NULL, callback, user_data);
- g_task_return_pointer (task, device_identifier, g_free);
+ device_identifier = mm_broadband_modem_create_device_identifier (MM_BROADBAND_MODEM (self), "", "", &error);
+ if (!device_identifier)
+ g_task_return_error (task, error);
+ else
+ g_task_return_pointer (task, device_identifier, g_free);
g_object_unref (task);
}
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 6e679aef..ee2adfc8 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -1146,9 +1146,9 @@ modem_load_device_identifier_finish (MMIfaceModem *self,
GAsyncResult *res,
GError **error)
{
- GError *inner_error = NULL;
- gpointer ctx = NULL;
- gchar *device_identifier;
+ GError *inner_error = NULL;
+ gpointer ctx = NULL;
+ gchar *device_identifier;
mm_base_modem_at_sequence_finish (MM_BASE_MODEM (self), res, &ctx, &inner_error);
if (inner_error) {
@@ -1157,10 +1157,16 @@ modem_load_device_identifier_finish (MMIfaceModem *self,
}
g_assert (ctx != NULL);
- device_identifier = (mm_broadband_modem_create_device_identifier (
- MM_BROADBAND_MODEM (self),
- ((DeviceIdentifierContext *)ctx)->ati,
- ((DeviceIdentifierContext *)ctx)->ati1));
+ device_identifier = mm_broadband_modem_create_device_identifier (
+ MM_BROADBAND_MODEM (self),
+ ((DeviceIdentifierContext *)ctx)->ati,
+ ((DeviceIdentifierContext *)ctx)->ati1,
+ &inner_error);
+ if (!device_identifier) {
+ g_propagate_error (error, inner_error);
+ return NULL;
+ }
+
mm_obj_dbg (self, "loaded device identifier: %s", device_identifier);
return device_identifier;
}
@@ -12521,10 +12527,18 @@ mm_broadband_modem_get_current_charset (MMBroadbandModem *self)
/*****************************************************************************/
gchar *
-mm_broadband_modem_create_device_identifier (MMBroadbandModem *self,
- const gchar *ati,
- const gchar *ati1)
-{
+mm_broadband_modem_create_device_identifier (MMBroadbandModem *self,
+ const gchar *ati,
+ const gchar *ati1,
+ GError **error)
+{
+ /* do nothing if device has gone already */
+ if (!self->priv->modem_dbus_skeleton) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Modem interface skeleton unavailable");
+ return NULL;
+ }
+
return (mm_create_device_identifier (
mm_base_modem_get_vendor_id (MM_BASE_MODEM (self)),
mm_base_modem_get_product_id (MM_BASE_MODEM (self)),
diff --git a/src/mm-broadband-modem.h b/src/mm-broadband-modem.h
index 1f5acac3..2ba05799 100644
--- a/src/mm-broadband-modem.h
+++ b/src/mm-broadband-modem.h
@@ -104,9 +104,10 @@ MMModemCharset mm_broadband_modem_get_current_charset (MMBroadbandModem *self);
/* Create a unique device identifier string using the ATI and ATI1 replies and some
* additional internal info */
-gchar *mm_broadband_modem_create_device_identifier (MMBroadbandModem *self,
- const gchar *ati,
- const gchar *ati1);
+gchar *mm_broadband_modem_create_device_identifier (MMBroadbandModem *self,
+ const gchar *ati,
+ const gchar *ati1,
+ GError **error);
/* Locking/unlocking SMS storages */
void mm_broadband_modem_lock_sms_storages (MMBroadbandModem *self,