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
This commit is contained in:
Aleksander Morgado
2021-05-23 00:38:09 +02:00
parent 1f10b3ff7f
commit 3da3623e11
4 changed files with 48 additions and 25 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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)),

View File

@@ -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,