diff options
author | Aleksander Morgado <aleksandermj@google.com> | 2022-07-16 15:30:19 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-07-16 22:24:33 +0200 |
commit | 1615c8627c89f2604d5b741ff39ef612a50bf46d (patch) | |
tree | a6f3eb978f6a060687f029518d9ed3e38fe3db52 /src | |
parent | 76f837697a62131af9e475f15e6babcaad3290f7 (diff) |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem.c | 76 |
1 files 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; |