UPSTREAM: 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.

BUG=b:172390546
TEST=Check that modem reprobes after 3 pin1 retries

Change-Id: Idf17a59dbfd0626004803180549eae441651b698
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/modemmanager-next/+/2565504
Reviewed-by: Andrew Lassalle <andrewlassalle@chromium.org>
Reviewed-by: Pavan Holla <pholla@google.com>
Tested-by: Pavan Holla <pholla@google.com>
Commit-Queue: Pavan Holla <pholla@google.com>
(cherry picked from commit 4c3f5050b6666c8c056e1a000e523289d96304f0)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/modemmanager-next/+/2578182
diff --git a/src/mm-base-sim.c b/src/mm-base-sim.c
index 106a0a9..8505119 100644
--- a/src/mm-base-sim.c
+++ b/src/mm-base-sim.c
@@ -88,6 +88,21 @@
 }
 
 /*****************************************************************************/
+/* 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 @@
     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 @@
     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 @@
 {
     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);