From 4ce23a9ebd02b84d1dcc1b98f0bd0d0f7637d039 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Mon, 3 Feb 2025 10:18:19 +0000 Subject: broadband-modem: exit with error if enable() while in unknown state We should not assert if the modem is flagged as invalid but an outstanding enabling request is processed. Let's exit gracefully and let the object get properly disposed afterwards. (libc.so.6 - pthread_kill.c: 44) __pthread_kill_implementation (libc.so.6 - raise.c: 26) raise (libc.so.6 - abort.c: 79) abort (libglib-2.0.so.0 - gtestutils.c: 3450) g_assertion_message (libglib-2.0.so.0 - gtestutils.c: 3476) g_assertion_message_expr (ModemManager - mm-broadband-modem.c) enable (ModemManager - mm-iface-modem.c: 2340) handle_enable_auth_ready (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now (libgio-2.0.so.0 - gtask.c: 1378) g_task_return (ModemManager - mm-base-modem.c: 2011) lock_after_authorize_ready (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now (libgio-2.0.so.0 - gtask.c: 1378) g_task_return (ModemManager - mm-base-modem.c: 1841) base_modem_operation_run (ModemManager - mm-base-modem.c: 764) state_operation_ready (libgio-2.0.so.0 - gtask.c: 1309) g_task_return_now (libgio-2.0.so.0 - gtask.c: 1323) complete_in_idle_cb (libglib-2.0.so.0 - gmain.c: 3460) g_main_dispatch (libglib-2.0.so.0 - gmain.c: 4200) g_main_context_dispatch (libglib-2.0.so.0 - gmain.c: 4276) g_main_context_iterate (libglib-2.0.so.0 - gmain.c: 4479) g_main_loop_run (ModemManager - main.c: 236) main (libc.so.6 - libc_start_call_main.h: 58) __libc_start_call_main (libc.so.6 - libc-start.c: 360) __libc_start_main_impl (ModemManager + 0x000b8850) _start --- src/mm-broadband-modem.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 6f06b8f3..7548f223 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -12660,8 +12660,12 @@ enable (MMBaseModem *self, /* Check state before launching modem enabling */ switch (MM_BROADBAND_MODEM (self)->priv->modem_state) { case MM_MODEM_STATE_UNKNOWN: - /* We should never have a UNKNOWN->ENABLED transition */ - g_assert_not_reached (); + /* We may have a UNKNOWN->ENABLED transition here if the request + * comes after having flagged the modem as invalid. Just error out + * gracefully. */ + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, + "Cannot enable modem: unknown state"); + g_object_unref (task); break; case MM_MODEM_STATE_FAILED: -- cgit v1.2.3-70-g09d2 From ef5fe9b8d5a273ff91b573fc40b223605c618c1e Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Mon, 3 Feb 2025 10:21:32 +0000 Subject: broadband-modem: prefer explicit return to break Just to make it explicit that there is no more logic running afterwards. --- src/mm-broadband-modem.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 7548f223..c4140015 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -12666,19 +12666,19 @@ enable (MMBaseModem *self, g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot enable modem: unknown state"); g_object_unref (task); - break; + return; case MM_MODEM_STATE_FAILED: g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot enable modem: initialization failed"); g_object_unref (task); - break; + return; case MM_MODEM_STATE_LOCKED: g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_WRONG_STATE, "Cannot enable modem: device locked"); g_object_unref (task); - break; + return; case MM_MODEM_STATE_INITIALIZING: case MM_MODEM_STATE_DISABLED: @@ -12688,7 +12688,7 @@ enable (MMBaseModem *self, case MM_MODEM_STATE_ENABLING: g_assert_not_reached (); - break; + return; case MM_MODEM_STATE_ENABLED: case MM_MODEM_STATE_SEARCHING: @@ -12699,7 +12699,7 @@ enable (MMBaseModem *self, /* Just return success, don't relaunch enabling */ g_task_return_boolean (task, TRUE); g_object_unref (task); - break; + return; default: g_assert_not_reached (); -- cgit v1.2.3-70-g09d2