diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-03-21 13:44:16 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-03-21 13:44:16 +0100 |
commit | 634682b602dd51efbda42a8b2e8764b9bb0024e2 (patch) | |
tree | 3f70cc23248473a08e6ca68c201b080a08636090 /plugins/cinterion/mm-modem-helpers-cinterion.c | |
parent | d01bca493dad933b9df51bec1254c79089ffa1c7 (diff) |
cinterion: make sure FALSE sets GError in parse_smong_response()
The g_regex_match_full() method may return FALSE without setting the
GError, so that case needs to be considered.
In addition to that, the following g_assert() was not doing what it
should have been, as it was comparing the address of the variable and
not the variable itself; rework the code to avoid that as well:
g_assert (access_tech != MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN);
Diffstat (limited to 'plugins/cinterion/mm-modem-helpers-cinterion.c')
-rw-r--r-- | plugins/cinterion/mm-modem-helpers-cinterion.c | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/plugins/cinterion/mm-modem-helpers-cinterion.c b/plugins/cinterion/mm-modem-helpers-cinterion.c index d397e423..67da6120 100644 --- a/plugins/cinterion/mm-modem-helpers-cinterion.c +++ b/plugins/cinterion/mm-modem-helpers-cinterion.c @@ -940,19 +940,23 @@ mm_cinterion_parse_sgauth_response (const gchar *response, /*****************************************************************************/ /* ^SMONG response parser */ -static MMModemAccessTechnology -get_access_technology_from_smong_gprs_status (guint gprs_status, - GError **error) +static gboolean +get_access_technology_from_smong_gprs_status (guint gprs_status, + MMModemAccessTechnology *out, + GError **error) { switch (gprs_status) { case 0: - return MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; + *out = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; + return TRUE; case 1: case 2: - return MM_MODEM_ACCESS_TECHNOLOGY_GPRS; + *out = MM_MODEM_ACCESS_TECHNOLOGY_GPRS; + return TRUE; case 3: case 4: - return MM_MODEM_ACCESS_TECHNOLOGY_EDGE; + *out = MM_MODEM_ACCESS_TECHNOLOGY_EDGE; + return TRUE; default: break; } @@ -963,7 +967,7 @@ get_access_technology_from_smong_gprs_status (guint gprs_status, "Couldn't get network capabilities, " "unsupported GPRS status value: '%u'", gprs_status); - return MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN; + return FALSE; } gboolean @@ -971,9 +975,10 @@ mm_cinterion_parse_smong_response (const gchar *response, MMModemAccessTechnology *access_tech, GError **error) { - GError *inner_error = NULL; - GMatchInfo *match_info = NULL; - GRegex *regex; + guint value = 0; + GError *inner_error = NULL; + g_autoptr(GMatchInfo) match_info = NULL; + g_autoptr(GRegex) regex; /* The AT^SMONG command returns a cell info table, where the second * column identifies the "GPRS status", which is exactly what we want. @@ -992,26 +997,21 @@ mm_cinterion_parse_smong_response (const gchar *response, 0, NULL); g_assert (regex); - if (g_regex_match_full (regex, response, strlen (response), 0, 0, &match_info, &inner_error)) { - guint value = 0; - - if (!mm_get_uint_from_match_info (match_info, 2, &value)) - inner_error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_FAILED, - "Couldn't read 'GPRS status' field from AT^SMONG response"); - else if (access_tech) - *access_tech = get_access_technology_from_smong_gprs_status (value, &inner_error); - } - - g_match_info_free (match_info); - g_regex_unref (regex); + g_regex_match_full (regex, response, strlen (response), 0, 0, &match_info, &inner_error); if (inner_error) { + g_prefix_error (&inner_error, "Failed to match AT^SMONG response: "); g_propagate_error (error, inner_error); return FALSE; } - g_assert (access_tech != MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN); - return TRUE; + if (!g_match_info_matches (match_info) || !mm_get_uint_from_match_info (match_info, 2, &value)) { + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Couldn't read 'GPRS status' field from AT^SMONG response"); + return FALSE; + } + + return get_access_technology_from_smong_gprs_status (value, access_tech, error); } /*****************************************************************************/ |