aboutsummaryrefslogtreecommitdiff
path: root/src/mm-broadband-modem.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@google.com>2022-07-16 15:30:19 +0200
committerAleksander Morgado <aleksander@aleksander.es>2022-07-16 22:24:33 +0200
commit1615c8627c89f2604d5b741ff39ef612a50bf46d (patch)
treea6f3eb978f6a060687f029518d9ed3e38fe3db52 /src/mm-broadband-modem.c
parent76f837697a62131af9e475f15e6babcaad3290f7 (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/mm-broadband-modem.c')
-rw-r--r--src/mm-broadband-modem.c76
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;