diff options
author | Pavan Holla <pholla@chromium.org> | 2020-11-23 20:24:05 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2020-11-26 08:53:14 +0000 |
commit | 1f0c04644dd48b086bc00f9765f94342f3badc3f (patch) | |
tree | 08f256fe72ea55f012f6f5d21b65248e9d54b499 | |
parent | 38f6704fa1d6f602be84bcbf016b3386ac82c426 (diff) |
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.
-rw-r--r-- | src/mm-base-sim.c | 33 |
1 files 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 @@ -88,6 +88,21 @@ mm_base_sim_export (MMBaseSim *self) } /*****************************************************************************/ +/* 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) */ static gboolean @@ -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); |