From fd052c8e584a41efc211690e993f6ef0ee3092ac Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Thu, 9 Jan 2020 12:46:11 +0100 Subject: [PATCH] base-sim: don't allow sending PIN/PUK if not required This avoids issues when e.g. sending SIM-PIN while the modem is already unlocked or when SIM-PIN is not enabled. Under those conditions, the needlessly sent SIM-PIN unlock attempt may fail while libmm-glib/mmcli reports a successful operation. E.g.: # mmcli --sim=/org/freedesktop/ModemManager1/SIM/0 --pin=3497 successfully sent PIN code to the SIM But in reality... Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [1574260732.489513] Verifying PIN... Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] sent message... <<<<<< RAW: <<<<<< length = 27 <<<<<< data = 01:1A:00:00:0B:02:00:09:00:26:00:0E:00:02:06:00:01:04:33:34:39:37:01:02:00:06:00 Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] sent generic request (translated)... <<<<<< QMUX: <<<<<< length = 26 <<<<<< flags = 0x00 <<<<<< service = "uim" <<<<<< client = 2 <<<<<< QMI: <<<<<< flags = "none" <<<<<< transaction = 9 <<<<<< tlv_length = 14 <<<<<< message = "Verify PIN" (0x0026) <<<<<< TLV: <<<<<< type = "Info" (0x02) <<<<<< length = 6 <<<<<< value = 01:04:33:34:39:37 <<<<<< translated = [ pin_id = 'pin1' pin_value = '3497' ] Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] received message... <<<<<< RAW: <<<<<< length = 30 <<<<<< data = 01:1D:00:80:0B:02:02:09:00:26:00:11:00:02:04:00:01:00:52:00:13:02:00:69:84:10:02:00:03:0A Wed Nov 20 14:38:52 2019 daemon.debug [4254]: [/dev/cdc-wdm0] received generic response (translated)... <<<<<< QMUX: <<<<<< length = 29 <<<<<< flags = 0x80 <<<<<< service = "uim" <<<<<< client = 2 <<<<<< QMI: <<<<<< flags = "response" <<<<<< transaction = 9 <<<<<< tlv_length = 17 <<<<<< message = "Verify PIN" (0x0026) <<<<<< TLV: <<<<<< type = "Result" (0x02) <<<<<< length = 4 <<<<<< value = 01:00:52:00 <<<<<< translated = FAILURE: AccessDenied As we already know what the current lock status is, just abort the user operation if the unlock operation isn't required. --- src/mm-base-sim.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c index 560db93d..7eca8e4a 100644 --- a/src/mm-base-sim.c +++ b/src/mm-base-sim.c @@ -635,6 +635,14 @@ mm_base_sim_send_pin (MMBaseSim *self, return; } + /* Only allow sending SIM-PIN if really SIM-PIN locked */ + if (mm_iface_modem_get_unlock_required (MM_IFACE_MODEM (self->priv->modem)) != MM_MODEM_LOCK_SIM_PIN) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, + "Cannot send PIN: device is not SIM-PIN locked"); + g_object_unref (task); + return; + } + MM_BASE_SIM_GET_CLASS (self)->send_pin (self, pin, (GAsyncReadyCallback)send_pin_ready, @@ -661,6 +669,14 @@ mm_base_sim_send_puk (MMBaseSim *self, return; } + /* Only allow sending SIM-PUK if really SIM-PUK locked */ + if (mm_iface_modem_get_unlock_required (MM_IFACE_MODEM (self->priv->modem)) != MM_MODEM_LOCK_SIM_PUK) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, + "Cannot send PUK: device is not SIM-PUK locked"); + g_object_unref (task); + return; + } + MM_BASE_SIM_GET_CLASS (self)->send_puk (self, puk, new_pin,