From 1f0c04644dd48b086bc00f9765f94342f3badc3f Mon Sep 17 00:00:00 2001 From: Pavan Holla Date: Mon, 23 Nov 2020 20:24:05 +0000 Subject: [PATCH] base-sim: Reprobe modem if puk lock is discovered after sending pin1 Enabling/Disabling/Changing/Sending the PIN1 lock is usually limited to 3 retries. If these attempts are exhausted, the modem is puk_locked. We reprobe the modem to get rid of any unwanted interfaces and move to a locked state. --- src/mm-base-sim.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c index 106a0a95..85051191 100644 --- a/src/mm-base-sim.c +++ b/src/mm-base-sim.c @@ -87,6 +87,21 @@ mm_base_sim_export (MMBaseSim *self) g_free (path); } +/*****************************************************************************/ +/* Reprobe when a puk lock is discovered after pin1_retries are exhausted */ + +static void +reprobe_if_puk_discovered (MMBaseSim *self, + GError *error) +{ + if (g_error_matches (error, + MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_SIM_PUK)) { + mm_obj_dbg (self, "Discovered PUK lock, discarding old modem..."); + mm_base_modem_process_sim_event (self->priv->modem); + } +} + /*****************************************************************************/ /* CHANGE PIN (Generic implementation) */ @@ -171,8 +186,9 @@ after_change_update_lock_info_ready (MMIfaceModem *modem, mm_iface_modem_update_lock_info_finish (modem, res, NULL); if (ctx->save_error) { - g_dbus_method_invocation_take_error (ctx->invocation, ctx->save_error); - ctx->save_error = NULL; + g_dbus_method_invocation_return_gerror (ctx->invocation, ctx->save_error); + reprobe_if_puk_discovered (ctx->self, ctx->save_error); + g_clear_error (&ctx->save_error); } else { mm_gdbus_sim_complete_change_pin (MM_GDBUS_SIM (ctx->self), ctx->invocation); } @@ -349,8 +365,9 @@ after_enable_update_lock_info_ready (MMIfaceModem *modem, mm_iface_modem_update_lock_info_finish (modem, res, NULL); if (ctx->save_error) { - g_dbus_method_invocation_take_error (ctx->invocation, ctx->save_error); - ctx->save_error = NULL; + g_dbus_method_invocation_return_gerror (ctx->invocation, ctx->save_error); + reprobe_if_puk_discovered (ctx->self, ctx->save_error); + g_clear_error (&ctx->save_error); } else { /* Signal about the new lock state */ g_signal_emit (ctx->self, signals[SIGNAL_PIN_LOCK_ENABLED], 0, ctx->enabled); @@ -786,9 +803,11 @@ handle_send_pin_ready (MMBaseSim *self, { GError *error = NULL; - if (!mm_base_sim_send_pin_finish (self, res, &error)) - g_dbus_method_invocation_take_error (ctx->invocation, error); - else + if (!mm_base_sim_send_pin_finish (self, res, &error)) { + g_dbus_method_invocation_return_gerror (ctx->invocation, error); + reprobe_if_puk_discovered (self, error); + g_clear_error (&error); + } else mm_gdbus_sim_complete_send_pin (MM_GDBUS_SIM (self), ctx->invocation); handle_send_pin_context_free (ctx);