sim: validate preferred networks operator codes

Validate preferred network operator codes in the SIM D-Bus interface
handler to ensure they are numeric. This prevents injecting AT
command delimiters (like CR) into this field, which is later spliced
into AT commands (+CPOL).

This change also plugs the network list leak, that was a problem on
its own.

https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/work_items/1065

Signed-off-by: Aleksander Morgado <aleksandermj@google.com>
This commit is contained in:
Aleksander Morgado
2026-07-10 13:43:48 +02:00
committed by Aleksander Morgado
parent 50202ad76a
commit 3291e7dd1c
+33 -1
View File
@@ -1546,12 +1546,34 @@ handle_set_preferred_networks_ready (MMBaseSim *self,
handle_set_preferred_networks_context_free (ctx);
}
static gboolean
validate_networks_list (GList *networks_list,
GError **error)
{
GList *l;
for (l = networks_list; l; l = g_list_next (l)) {
MMSimPreferredNetwork *network = (MMSimPreferredNetwork *)l->data;
const gchar *operator_code;
operator_code = mm_sim_preferred_network_get_operator_code (network);
if (!mm_utils_is_numeric (operator_code)) {
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_INVALID_ARGS,
"Invalid operator code: '%s'", operator_code);
return FALSE;
}
}
return TRUE;
}
static void
handle_set_preferred_networks_auth_ready (MMAuthProvider *authp,
GAsyncResult *res,
HandleSetPreferredNetworksContext *ctx)
{
GError *error = NULL;
GList *networks_list = NULL;
if (!mm_auth_provider_authorize_finish (authp, res, &error)) {
mm_dbus_method_invocation_take_error (ctx->invocation, error);
@@ -1581,12 +1603,22 @@ handle_set_preferred_networks_auth_ready (MMAuthProvider *authp,
return;
}
networks_list = mm_sim_preferred_network_list_new_from_variant (ctx->networks);
if (!validate_networks_list (networks_list, &error)) {
g_list_free_full (networks_list, g_object_unref);
mm_dbus_method_invocation_take_error (ctx->invocation, error);
handle_set_preferred_networks_context_free (ctx);
return;
}
mm_obj_info (ctx->self, "processing user request to set preferred networks...");
MM_BASE_SIM_GET_CLASS (ctx->self)->set_preferred_networks (
ctx->self,
mm_sim_preferred_network_list_new_from_variant (ctx->networks),
networks_list,
(GAsyncReadyCallback)handle_set_preferred_networks_ready,
ctx);
g_list_free_full (networks_list, g_object_unref);
}
static gboolean