From 1615c8627c89f2604d5b741ff39ef612a50bf46d Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Sat, 16 Jul 2022 15:30:19 +0200 Subject: [PATCH] broadband-modem: don't make fatal SIM swap check of IMSI or ICCID If the SIM swap check using ICCID or IMSI fail, don't completely fail the operation, as the other one may still succeed. Fail the operation only if both checks failed. --- src/mm-broadband-modem.c | 76 +++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 39 deletions(-) diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 2f889dc4..f1a0aee2 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -4140,7 +4140,9 @@ typedef struct { MMBaseSim *sim; guint retries; gchar *iccid; + gboolean iccid_check_done; gchar *imsi; + gboolean imsi_check_done; SimSwapCheckStep step; } SimSwapContext; @@ -4179,20 +4181,16 @@ complete_sim_swap_check (GTask *task, self = MM_BROADBAND_MODEM (g_task_get_source_object (task)); ctx = g_task_get_task_data (task); - switch (ctx->step) { - case SIM_SWAP_CHECK_STEP_ICCID_CHANGED: + if (ctx->step == SIM_SWAP_CHECK_STEP_ICCID_CHANGED) { + ctx->iccid_check_done = TRUE; cached = mm_gdbus_sim_get_sim_identifier (MM_GDBUS_SIM (ctx->sim)); str = "identifier"; - break; - case SIM_SWAP_CHECK_STEP_IMSI_CHANGED: + } else if (ctx->step == SIM_SWAP_CHECK_STEP_IMSI_CHANGED) { + ctx->imsi_check_done = TRUE; cached = mm_gdbus_sim_get_imsi (MM_GDBUS_SIM (ctx->sim)); str = "imsi"; - break; - case SIM_SWAP_CHECK_STEP_FIRST: - case SIM_SWAP_CHECK_STEP_LAST: - default: + } else g_assert_not_reached(); - } if (g_strcmp0 (current, cached) != 0) { mm_obj_info (self, "SIM %s has changed: %s -> %s", @@ -4222,25 +4220,20 @@ load_sim_step_ready (MMBaseSim *sim, self = MM_BROADBAND_MODEM (g_task_get_source_object (task)); ctx = g_task_get_task_data (task); - switch (ctx->step) { - case SIM_SWAP_CHECK_STEP_ICCID_CHANGED: + if (ctx->step == SIM_SWAP_CHECK_STEP_ICCID_CHANGED) { current = mm_base_sim_load_sim_identifier_finish (sim, res, &error); str = "identifier"; - break; - case SIM_SWAP_CHECK_STEP_IMSI_CHANGED: + } else if (ctx->step == SIM_SWAP_CHECK_STEP_IMSI_CHANGED) { current = MM_BASE_SIM_GET_CLASS (sim)->load_imsi_finish (sim, res, &error); str = "imsi"; - break; - case SIM_SWAP_CHECK_STEP_FIRST: - case SIM_SWAP_CHECK_STEP_LAST: - default: + } else g_assert_not_reached(); - } if (error) { if (g_error_matches (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED)) { - g_task_return_error (task, error); - g_object_unref (task); + /* Skip checking this field right away */ + ctx->step++; + sim_swap_check_step (task); return; } @@ -4251,14 +4244,16 @@ load_sim_step_ready (MMBaseSim *sim, g_clear_error (&error); if (ctx->step == SIM_SWAP_CHECK_STEP_ICCID_CHANGED) g_timeout_add_seconds (1, (GSourceFunc) load_sim_identifier, task); - else + else if (ctx->step == SIM_SWAP_CHECK_STEP_IMSI_CHANGED) g_timeout_add_seconds (1, (GSourceFunc) load_sim_imsi, task); + else + g_assert_not_reached(); return; } mm_obj_warn (self, "could not load SIM %s: %s", str, error->message); - g_task_return_error (task, error); - g_object_unref (task); + ctx->step++; + sim_swap_check_step (task); return; } @@ -4268,7 +4263,9 @@ load_sim_step_ready (MMBaseSim *sim, static gboolean load_sim_identifier (GTask *task) { - SimSwapContext *ctx = g_task_get_task_data (task); + SimSwapContext *ctx; + + ctx = g_task_get_task_data (task); mm_base_sim_load_sim_identifier (ctx->sim, (GAsyncReadyCallback)load_sim_step_ready, @@ -4280,22 +4277,20 @@ load_sim_identifier (GTask *task) static gboolean load_sim_imsi (GTask *task) { - SimSwapContext *ctx = g_task_get_task_data (task); + SimSwapContext *ctx; - if (!MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi || - !MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi_finish) { - g_task_return_new_error (task, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "sim imsi could not be loaded"); - g_object_unref (task); - return G_SOURCE_REMOVE; + ctx = g_task_get_task_data (task); + + if (MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi && + MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi_finish) { + MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi (ctx->sim, + (GAsyncReadyCallback)load_sim_step_ready, + task); + } else { + ctx->step++; + sim_swap_check_step (task); } - MM_BASE_SIM_GET_CLASS (ctx->sim)->load_imsi ( - ctx->sim, - (GAsyncReadyCallback)load_sim_step_ready, - task); return G_SOURCE_REMOVE; } @@ -4323,7 +4318,6 @@ sim_swap_check_step (GTask *task) case SIM_SWAP_CHECK_STEP_IMSI_CHANGED: ctx->retries = SIM_SWAP_CHECK_LOAD_RETRIES_MAX; - if (ctx->imsi) complete_sim_swap_check (task, ctx->imsi); else @@ -4331,7 +4325,11 @@ sim_swap_check_step (GTask *task) return; case SIM_SWAP_CHECK_STEP_LAST: - g_task_return_boolean (task, TRUE); + if (!ctx->iccid_check_done && !ctx->imsi_check_done) + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Couldn't do either ICCID or IMSI check"); + else + g_task_return_boolean (task, TRUE); g_object_unref (task); return;