From 0e1bfdb5b6c67475c01d8b60b38dff67173044b8 Mon Sep 17 00:00:00 2001 From: Andrey Skvortsov Date: Sat, 16 Aug 2025 18:19:16 +0300 Subject: [PATCH] shared-qmi: fix setting URL to supl server Function mm_parse_suple_address returns TRUE on valid input data regardless of its type (URL or IP). As a result qmi_message_loc_set_server_input_set_ipv4 was always called on valid data. If URL was provided, then 0.0.0.0 ip address was sent to the modem instead of provided URL. Fixes: 6e84f3d4593 ("iface-modem-location: validate SUPL server address") Signed-off-by: Andrey Skvortsov --- src/mm-shared-qmi.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c index 387de255..4c8dbf44 100644 --- a/src/mm-shared-qmi.c +++ b/src/mm-shared-qmi.c @@ -4525,13 +4525,20 @@ pds_set_supl_server (GTask *task) MMSharedQmi *self; SetSuplServerContext *ctx; QmiMessagePdsSetAgpsConfigInput *input; - guint32 ip; + guint32 ip = 0; guint16 port; GArray *url; + GError *error = NULL; self = g_task_get_source_object (task); ctx = g_task_get_task_data (task); + if (!mm_parse_supl_address (ctx->supl, NULL, &ip, &port, &error)) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + input = qmi_message_pds_set_agps_config_input_new (); /* For multimode devices, prefer UMTS by default */ @@ -4540,7 +4547,7 @@ pds_set_supl_server (GTask *task) else if (mm_iface_modem_is_cdma (MM_IFACE_MODEM (self))) qmi_message_pds_set_agps_config_input_set_network_mode (input, QMI_PDS_NETWORK_MODE_CDMA, NULL); - if (mm_parse_supl_address (ctx->supl, NULL, &ip, &port, NULL)) + if (ip) qmi_message_pds_set_agps_config_input_set_location_server_address (input, GUINT32_FROM_BE (ip), port, NULL); else { url = parse_as_utf16_url (ctx->supl); @@ -4640,12 +4647,19 @@ loc_set_supl_server (GTask *task) MMSharedQmi *self; SetSuplServerContext *ctx; QmiMessageLocSetServerInput *input; - guint32 ip; + guint32 ip = 0; guint16 port; + GError *error = NULL; self = g_task_get_source_object (task); ctx = g_task_get_task_data (task); + if (!mm_parse_supl_address (ctx->supl, NULL, &ip, &port, &error)) { + g_task_return_error (task, error); + g_object_unref (task); + return; + } + input = qmi_message_loc_set_server_input_new (); /* For multimode devices, prefer UMTS by default */ @@ -4654,7 +4668,7 @@ loc_set_supl_server (GTask *task) else if (mm_iface_modem_is_cdma (MM_IFACE_MODEM (self))) qmi_message_loc_set_server_input_set_server_type (input, QMI_LOC_SERVER_TYPE_CDMA_PDE, NULL); - if (mm_parse_supl_address (ctx->supl, NULL, &ip, &port, NULL)) + if (ip) qmi_message_loc_set_server_input_set_ipv4 (input, GUINT32_FROM_BE (ip), (guint32) port, NULL); else qmi_message_loc_set_server_input_set_url (input, ctx->supl, NULL);