aboutsummaryrefslogtreecommitdiff
path: root/src/mm-modem-helpers.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2022-08-24 12:31:47 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2022-09-05 17:33:11 +0000
commit74fc5baca229922b244ad66d5819d6d765e2d9da (patch)
treeb8162255a86134a355481e4b72137d25efa39e20 /src/mm-modem-helpers.c
parentb2a186b5c8c5f36fe02b8fab0f64fabf2878bc21 (diff)
core: port GRegex/GMatchInfo to use autoptr()
The behavior of GRegex changed in 2.73.2 once it was ported from pcre1 to pcre2. In some cases it was made more strict, which is fine, in other cases it exposed some change in how it behaves on certain matches that is not extremely clear whether it's ok or not. See https://gitlab.gnome.org/GNOME/glib/-/issues/2729 See https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/601 See https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/621 Either way, one thing that was assumed was that initializing all GRegex/GMatchInfo variables to NULL and making sure they're NULL before they're initialized by glib (especially the GMatchInfo) was a good and safer approach. So, whenever possible, g_autoptr() is used to cleanup the allocated GMatchInfo/GRegex variables, and otherwise, g_clear_pointer() is used to ensure that no free/unref is attempted unless the given variable is not NULL, and also so that the variable is reseted to NULL after being disposed.
Diffstat (limited to 'src/mm-modem-helpers.c')
-rw-r--r--src/mm-modem-helpers.c538
1 files changed, 212 insertions, 326 deletions
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c
index 5e58ba9d..58207bb1 100644
--- a/src/mm-modem-helpers.c
+++ b/src/mm-modem-helpers.c
@@ -528,10 +528,10 @@ mm_3gpp_parse_clcc_response (const gchar *str,
GList **out_list,
GError **error)
{
- GRegex *r;
- GList *list = NULL;
- GError *inner_error = NULL;
- GMatchInfo *match_info = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GList *list = NULL;
+ GError *inner_error = NULL;
static const MMCallDirection call_direction[] = {
[0] = MM_CALL_DIRECTION_OUTGOING,
@@ -641,9 +641,6 @@ mm_3gpp_parse_clcc_response (const gchar *str,
}
out:
- g_clear_pointer (&match_info, g_match_info_free);
- g_regex_unref (r);
-
if (inner_error) {
mm_3gpp_call_info_list_free (list);
g_propagate_error (error, inner_error);
@@ -736,12 +733,12 @@ mm_parse_ifc_test_response (const gchar *response,
gpointer log_object,
GError **error)
{
- GRegex *r;
- GError *inner_error = NULL;
- GMatchInfo *match_info = NULL;
- MMFlowControl te_mask = MM_FLOW_CONTROL_UNKNOWN;
- MMFlowControl ta_mask = MM_FLOW_CONTROL_UNKNOWN;
- MMFlowControl mask = MM_FLOW_CONTROL_UNKNOWN;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ MMFlowControl te_mask = MM_FLOW_CONTROL_UNKNOWN;
+ MMFlowControl ta_mask = MM_FLOW_CONTROL_UNKNOWN;
+ MMFlowControl mask = MM_FLOW_CONTROL_UNKNOWN;
r = g_regex_new ("(?:\\+IFC:)?\\s*\\((.*)\\),\\((.*)\\)(?:\\r\\n)?", 0, 0, NULL);
g_assert (r != NULL);
@@ -767,10 +764,6 @@ mm_parse_ifc_test_response (const gchar *response,
mask = te_mask & ta_mask;
out:
-
- g_clear_pointer (&match_info, g_match_info_free);
- g_regex_unref (r);
-
if (inner_error)
g_propagate_error (error, inner_error);
@@ -982,21 +975,21 @@ mm_3gpp_parse_ws46_test_response (const gchar *response,
gpointer log_object,
GError **error)
{
- GArray *modes = NULL;
- GArray *tech_values = NULL;
- GRegex *r;
- GError *inner_error = NULL;
- GMatchInfo *match_info = NULL;
- gchar *full_list = NULL;
- guint val;
- guint i;
- guint j;
- gboolean supported_5g = FALSE;
- gboolean supported_4g = FALSE;
- gboolean supported_3g = FALSE;
- gboolean supported_2g = FALSE;
- gboolean supported_mode_25 = FALSE;
- gboolean supported_mode_29 = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GArray *modes = NULL;
+ GArray *tech_values = NULL;
+ GError *inner_error = NULL;
+ gchar *full_list = NULL;
+ guint val;
+ guint i;
+ guint j;
+ gboolean supported_5g = FALSE;
+ gboolean supported_4g = FALSE;
+ gboolean supported_3g = FALSE;
+ gboolean supported_2g = FALSE;
+ gboolean supported_mode_25 = FALSE;
+ gboolean supported_mode_29 = FALSE;
r = g_regex_new ("(?:\\+WS46:)?\\s*\\((.*)\\)(?:\\r\\n)?", 0, 0, NULL);
g_assert (r != NULL);
@@ -1095,9 +1088,6 @@ out:
g_free (full_list);
- g_clear_pointer (&match_info, g_match_info_free);
- g_regex_unref (r);
-
if (inner_error) {
g_propagate_error (error, inner_error);
return NULL;
@@ -1190,10 +1180,10 @@ mm_3gpp_parse_cops_test_response (const gchar *reply,
gpointer log_object,
GError **error)
{
- GRegex *r;
- GList *info_list = NULL;
- GMatchInfo *match_info;
- gboolean umts_format = TRUE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GList *info_list = NULL;
+ gboolean umts_format = TRUE;
g_return_val_if_fail (reply != NULL, NULL);
if (error)
@@ -1227,9 +1217,8 @@ mm_3gpp_parse_cops_test_response (const gchar *reply,
/* If we didn't get any hits, try the pre-UMTS format match */
if (!g_regex_match (r, reply, 0, &match_info)) {
- g_regex_unref (r);
- g_match_info_free (match_info);
- match_info = NULL;
+ g_clear_pointer (&r, g_regex_unref);
+ g_clear_pointer (&match_info, g_match_info_free);
/* Pre-UMTS format doesn't include the cell access technology after
* the numeric operator element.
@@ -1320,9 +1309,6 @@ mm_3gpp_parse_cops_test_response (const gchar *reply,
g_match_info_next (match_info, NULL);
}
- g_match_info_free (match_info);
- g_regex_unref (r);
-
return info_list;
}
@@ -1337,14 +1323,14 @@ mm_3gpp_parse_cops_read_response (const gchar *response,
gpointer log_object,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
- GError *inner_error = NULL;
- guint mode = 0;
- guint format = 0;
- gchar *operator = NULL;
- guint actval = 0;
- MMModemAccessTechnology act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ guint mode = 0;
+ guint format = 0;
+ gchar *operator = NULL;
+ guint actval = 0;
+ MMModemAccessTechnology act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
g_assert (out_mode || out_format || out_operator || out_act);
@@ -1390,9 +1376,6 @@ mm_3gpp_parse_cops_read_response (const gchar *response,
}
out:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
g_free (operator);
g_propagate_error (error, inner_error);
@@ -1725,10 +1708,10 @@ mm_3gpp_parse_cgdcont_test_response (const gchar *response,
gpointer log_object,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
- GError *inner_error = NULL;
- GList *list = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ GList *list = NULL;
if (!response || !g_str_has_prefix (response, "+CGDCONT:")) {
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Missing +CGDCONT prefix");
@@ -1776,9 +1759,6 @@ mm_3gpp_parse_cgdcont_test_response (const gchar *response,
g_match_info_next (match_info, &inner_error);
}
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
mm_obj_warn (log_object, "unexpected error matching +CGDCONT response: '%s'", inner_error->message);
g_error_free (inner_error);
@@ -1813,52 +1793,46 @@ GList *
mm_3gpp_parse_cgdcont_read_response (const gchar *reply,
GError **error)
{
- GError *inner_error = NULL;
- GRegex *r;
- GMatchInfo *match_info;
- GList *list;
+ GError *inner_error = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GList *list = NULL;
if (!reply || !reply[0])
/* No APNs configured, all done */
return NULL;
- list = NULL;
r = g_regex_new ("\\+CGDCONT:\\s*(\\d+)\\s*,([^, \\)]*)\\s*,([^, \\)]*)\\s*,([^, \\)]*)",
G_REGEX_DOLLAR_ENDONLY | G_REGEX_RAW,
- 0, &inner_error);
- if (r) {
- g_regex_match_full (r, reply, strlen (reply), 0, 0, &match_info, &inner_error);
-
- while (!inner_error &&
- g_match_info_matches (match_info)) {
- gchar *str;
- MMBearerIpFamily ip_family;
-
- str = mm_get_string_unquoted_from_match_info (match_info, 2);
- ip_family = mm_3gpp_get_ip_family_from_pdp_type (str);
- if (ip_family != MM_BEARER_IP_FAMILY_NONE) {
- MM3gppPdpContext *pdp;
-
- pdp = g_slice_new0 (MM3gppPdpContext);
- if (!mm_get_uint_from_match_info (match_info, 1, &pdp->cid)) {
- inner_error = g_error_new (MM_CORE_ERROR,
- MM_CORE_ERROR_FAILED,
- "Couldn't parse CID from reply: '%s'",
- reply);
- break;
- }
- pdp->pdp_type = ip_family;
- pdp->apn = mm_get_string_unquoted_from_match_info (match_info, 3);
+ 0, NULL);
+ g_assert (r);
- list = g_list_prepend (list, pdp);
+ g_regex_match_full (r, reply, strlen (reply), 0, 0, &match_info, &inner_error);
+ while (!inner_error && g_match_info_matches (match_info)) {
+ gchar *str;
+ MMBearerIpFamily ip_family;
+
+ str = mm_get_string_unquoted_from_match_info (match_info, 2);
+ ip_family = mm_3gpp_get_ip_family_from_pdp_type (str);
+ if (ip_family != MM_BEARER_IP_FAMILY_NONE) {
+ MM3gppPdpContext *pdp;
+
+ pdp = g_slice_new0 (MM3gppPdpContext);
+ if (!mm_get_uint_from_match_info (match_info, 1, &pdp->cid)) {
+ inner_error = g_error_new (MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "Couldn't parse CID from reply: '%s'",
+ reply);
+ break;
}
+ pdp->pdp_type = ip_family;
+ pdp->apn = mm_get_string_unquoted_from_match_info (match_info, 3);
- g_free (str);
- g_match_info_next (match_info, &inner_error);
+ list = g_list_prepend (list, pdp);
}
- g_match_info_free (match_info);
- g_regex_unref (r);
+ g_free (str);
+ g_match_info_next (match_info, &inner_error);
}
if (inner_error) {
@@ -1868,9 +1842,7 @@ mm_3gpp_parse_cgdcont_read_response (const gchar *reply,
return NULL;
}
- list = g_list_sort (list, (GCompareFunc)mm_3gpp_pdp_context_cmp);
-
- return list;
+ return g_list_sort (list, (GCompareFunc)mm_3gpp_pdp_context_cmp);
}
/*************************************************************************/
@@ -1898,16 +1870,15 @@ GList *
mm_3gpp_parse_cgact_read_response (const gchar *reply,
GError **error)
{
- GError *inner_error = NULL;
- GRegex *r;
- GMatchInfo *match_info;
- GList *list;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ GList *list = NULL;
if (!reply || !reply[0])
/* Nothing configured, all done */
return NULL;
- list = NULL;
r = g_regex_new ("\\+CGACT:\\s*(\\d+),(\\d+)",
G_REGEX_DOLLAR_ENDONLY | G_REGEX_RAW, 0, &inner_error);
g_assert (r);
@@ -1941,9 +1912,6 @@ mm_3gpp_parse_cgact_read_response (const gchar *reply,
g_match_info_next (match_info, &inner_error);
}
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
mm_3gpp_pdp_context_active_list_free (list);
g_propagate_error (error, inner_error);
@@ -2142,10 +2110,11 @@ mm_3gpp_parse_cmgf_test_response (const gchar *reply,
gboolean *sms_text_supported,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
- gchar *s;
- guint32 min = -1, max = -1;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ gchar *s;
+ guint32 min = -1;
+ guint32 max = -1;
/* Strip whitespace and response tag */
if (g_str_has_prefix (reply, CMGF_TAG))
@@ -2163,8 +2132,6 @@ mm_3gpp_parse_cmgf_test_response (const gchar *reply,
MM_CORE_ERROR_FAILED,
"Failed to parse CMGF query result '%s'",
reply);
- g_match_info_free (match_info);
- g_regex_unref (r);
return FALSE;
}
@@ -2184,8 +2151,6 @@ mm_3gpp_parse_cmgf_test_response (const gchar *reply,
/* CMGF=1 for Text mode */
*sms_text_supported = (max >= 1);
- g_match_info_free (match_info);
- g_regex_unref (r);
return TRUE;
}
@@ -2196,12 +2161,12 @@ mm_3gpp_parse_cmgr_read_response (const gchar *reply,
guint index,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
- gint count;
- gint status;
- gchar *pdu;
- MM3gppPduInfo *info = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ gint count;
+ gint status;
+ gchar *pdu;
+ MM3gppPduInfo *info = NULL;
/* +CMGR: <stat>,<alpha>,<length>(whitespace)<pdu> */
/* The <alpha> and <length> fields are matched, but not currently used */
@@ -2214,7 +2179,7 @@ mm_3gpp_parse_cmgr_read_response (const gchar *reply,
MM_CORE_ERROR_FAILED,
"Failed to parse CMGR read result: response didn't match '%s'",
reply);
- goto done;
+ return NULL;
}
/* g_match_info_get_match_count includes match #0 */
@@ -2225,7 +2190,7 @@ mm_3gpp_parse_cmgr_read_response (const gchar *reply,
"Failed to match CMGR fields (matched %d) '%s'",
count,
reply);
- goto done;
+ return NULL;
}
if (!mm_get_int_from_match_info (match_info, 1, &status)) {
@@ -2234,7 +2199,7 @@ mm_3gpp_parse_cmgr_read_response (const gchar *reply,
MM_CORE_ERROR_FAILED,
"Failed to extract CMGR status field '%s'",
reply);
- goto done;
+ return NULL;
}
@@ -2245,18 +2210,13 @@ mm_3gpp_parse_cmgr_read_response (const gchar *reply,
MM_CORE_ERROR_FAILED,
"Failed to extract CMGR pdu field '%s'",
reply);
- goto done;
+ return NULL;
}
info = g_new0 (MM3gppPduInfo, 1);
info->index = index;
info->status = status;
info->pdu = pdu;
-
-done:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
return info;
}
@@ -2270,8 +2230,8 @@ mm_3gpp_parse_crsm_response (const gchar *reply,
gchar **hex,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
g_assert (sw1 != NULL);
g_assert (sw2 != NULL);
@@ -2292,11 +2252,9 @@ mm_3gpp_parse_crsm_response (const gchar *reply,
if (g_regex_match (r, reply, 0, &match_info) &&
mm_get_uint_from_match_info (match_info, 1, sw1) &&
- mm_get_uint_from_match_info (match_info, 2, sw2))
+ mm_get_uint_from_match_info (match_info, 2, sw2)) {
*hex = mm_get_string_unquoted_from_match_info (match_info, 3);
-
- g_match_info_free (match_info);
- g_regex_unref (r);
+ }
if (*hex == NULL) {
g_set_error (error,
@@ -2372,19 +2330,19 @@ mm_3gpp_parse_cgcontrdp_response (const gchar *response,
gchar **out_dns_secondary_address,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
- GError *inner_error = NULL;
- guint cid = 0;
- guint bearer_id = 0;
- gchar *apn = NULL;
- gchar *local_address_and_subnet = NULL;
- gchar *local_address = NULL;
- gchar *subnet = NULL;
- gchar *gateway_address = NULL;
- gchar *dns_primary_address = NULL;
- gchar *dns_secondary_address = NULL;
- guint field_format_extra_index = 0;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ guint cid = 0;
+ guint bearer_id = 0;
+ gchar *apn = NULL;
+ gchar *local_address_and_subnet = NULL;
+ gchar *local_address = NULL;
+ gchar *subnet = NULL;
+ gchar *gateway_address = NULL;
+ gchar *dns_primary_address = NULL;
+ gchar *dns_secondary_address = NULL;
+ guint field_format_extra_index = 0;
/* Response may be e.g.:
* +CGCONTRDP: 4,5,"ibox.tim.it.mnc001.mcc222.gprs","2.197.17.49.255.255.255.255","2.197.17.49","10.207.43.46","10.206.56.132","0.0.0.0","0.0.0.0",0
@@ -2462,9 +2420,6 @@ mm_3gpp_parse_cgcontrdp_response (const gchar *response,
dns_secondary_address = mm_get_string_unquoted_from_match_info (match_info, 7 + field_format_extra_index);
out:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
g_free (local_address_and_subnet);
if (inner_error) {
@@ -2513,10 +2468,10 @@ mm_3gpp_parse_cfun_query_response (const gchar *response,
guint *out_state,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
- GError *inner_error = NULL;
- guint state = G_MAXUINT;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ guint state = G_MAXUINT;
g_assert (out_state != NULL);
@@ -2546,9 +2501,6 @@ mm_3gpp_parse_cfun_query_response (const gchar *response,
*out_state = state;
out:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
g_propagate_error (error, inner_error);
return FALSE;
@@ -2570,16 +2522,16 @@ mm_3gpp_parse_cesq_response (const gchar *response,
guint *out_rsrp,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info;
- GError *inner_error = NULL;
- guint rxlev = 99;
- guint ber = 99;
- guint rscp = 255;
- guint ecn0 = 255;
- guint rsrq = 255;
- guint rsrp = 255;
- gboolean success = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ guint rxlev = 99;
+ guint ber = 99;
+ guint rscp = 255;
+ guint ecn0 = 255;
+ guint rsrq = 255;
+ guint rsrp = 255;
+ gboolean success = FALSE;
g_assert (out_rxlev);
g_assert (out_ber);
@@ -2624,9 +2576,6 @@ mm_3gpp_parse_cesq_response (const gchar *response,
}
out:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
g_propagate_error (error, inner_error);
return FALSE;
@@ -2883,10 +2832,10 @@ mm_3gpp_parse_ccwa_service_query_response (const gchar *response,
gboolean *status,
GError **error)
{
- GRegex *r;
- GError *inner_error = NULL;
- GMatchInfo *match_info = NULL;
- gint class_1_status = -1;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ gint class_1_status = -1;
/*
* AT+CCWA=<n>[,<mode>]
@@ -2928,9 +2877,6 @@ mm_3gpp_parse_ccwa_service_query_response (const gchar *response,
}
out:
- g_clear_pointer (&match_info, g_match_info_free);
- g_regex_unref (r);
-
if (inner_error) {
g_propagate_error (error, inner_error);
return FALSE;
@@ -3035,8 +2981,8 @@ mm_3gpp_parse_cpms_test_response (const gchar *reply,
g_assert (r);
for (i = 0; i < N_EXPECTED_GROUPS; i++) {
- GMatchInfo *match_info = NULL;
- GArray *array;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GArray *array;
/* We always return a valid array, even if it may be empty */
array = g_array_new (FALSE, FALSE, sizeof (MMSmsStorage));
@@ -3058,7 +3004,6 @@ mm_3gpp_parse_cpms_test_response (const gchar *reply,
g_match_info_next (match_info, NULL);
}
}
- g_match_info_free (match_info);
if (!tmp1)
tmp1 = array;
@@ -3100,43 +3045,31 @@ mm_3gpp_parse_cpms_query_response (const gchar *reply,
MMSmsStorage *memw,
GError **error)
{
- GRegex *r = NULL;
- gboolean ret = FALSE;
- GMatchInfo *match_info = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
r = g_regex_new (CPMS_QUERY_REGEX, G_REGEX_RAW, 0, NULL);
-
g_assert (r);
if (!g_regex_match (r, reply, 0, &match_info)) {
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Could not parse CPMS query response '%s'", reply);
- goto end;
+ return FALSE;
}
if (!g_match_info_matches (match_info)) {
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Could not find matches in CPMS query reply '%s'", reply);
- goto end;
- }
-
- if (!mm_3gpp_get_cpms_storage_match (match_info, "memr", memr, error)) {
- goto end;
- }
-
- if (!mm_3gpp_get_cpms_storage_match (match_info, "memw", memw, error)) {
- goto end;
+ return FALSE;
}
- ret = TRUE;
-
-end:
- if (r != NULL)
- g_regex_unref (r);
+ if (!mm_3gpp_get_cpms_storage_match (match_info, "memr", memr, error))
+ return FALSE;
- g_match_info_free (match_info);
+ if (!mm_3gpp_get_cpms_storage_match (match_info, "memw", memw, error))
+ return FALSE;
- return ret;
+ return TRUE;
}
gboolean
@@ -3168,11 +3101,12 @@ gboolean
mm_3gpp_parse_cscs_test_response (const gchar *reply,
MMModemCharset *out_charsets)
{
- MMModemCharset charsets = MM_MODEM_CHARSET_UNKNOWN;
- GRegex *r;
- GMatchInfo *match_info;
- gchar *p, *str;
- gboolean success = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ MMModemCharset charsets = MM_MODEM_CHARSET_UNKNOWN;
+ gchar *p;
+ gchar *str;
+ gboolean success = FALSE;
g_return_val_if_fail (reply != NULL, FALSE);
g_return_val_if_fail (out_charsets != NULL, FALSE);
@@ -3194,8 +3128,7 @@ mm_3gpp_parse_cscs_test_response (const gchar *reply,
/* Now parse each charset */
r = g_regex_new ("\\s*([^,\\)]+)\\s*", 0, 0, NULL);
- if (!r)
- return FALSE;
+ g_assert (r);
if (g_regex_match (r, p, 0, &match_info)) {
while (g_match_info_matches (match_info)) {
@@ -3207,8 +3140,6 @@ mm_3gpp_parse_cscs_test_response (const gchar *reply,
success = TRUE;
}
}
- g_match_info_free (match_info);
- g_regex_unref (r);
if (success)
*out_charsets = charsets;
@@ -3222,8 +3153,8 @@ gboolean
mm_3gpp_parse_clck_test_response (const gchar *reply,
MMModem3gppFacility *out_facilities)
{
- GRegex *r;
- GMatchInfo *match_info;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
g_return_val_if_fail (reply != NULL, FALSE);
g_return_val_if_fail (out_facilities != NULL, FALSE);
@@ -3252,8 +3183,6 @@ mm_3gpp_parse_clck_test_response (const gchar *reply,
g_match_info_next (match_info, NULL);
}
}
- g_match_info_free (match_info);
- g_regex_unref (r);
return (*out_facilities != MM_MODEM_3GPP_FACILITY_NONE);
}
@@ -3264,9 +3193,8 @@ gboolean
mm_3gpp_parse_clck_write_response (const gchar *reply,
gboolean *enabled)
{
- GRegex *r;
- GMatchInfo *match_info;
- gboolean success = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
g_return_val_if_fail (reply != NULL, FALSE);
g_return_val_if_fail (enabled != NULL, FALSE);
@@ -3277,7 +3205,7 @@ mm_3gpp_parse_clck_write_response (const gchar *reply,
g_assert (r != NULL);
if (g_regex_match (r, reply, 0, &match_info)) {
- gchar *str;
+ g_autofree gchar *str = NULL;
str = g_match_info_fetch (match_info, 1);
if (str) {
@@ -3289,15 +3217,11 @@ mm_3gpp_parse_clck_write_response (const gchar *reply,
*enabled = TRUE;
else
g_assert_not_reached ();
-
- g_free (str);
- success = TRUE;
+ return TRUE;
}
}
- g_match_info_free (match_info);
- g_regex_unref (r);
- return success;
+ return FALSE;
}
/*************************************************************************/
@@ -3530,10 +3454,10 @@ GHashTable *
mm_3gpp_parse_cind_test_response (const gchar *reply,
GError **error)
{
- GHashTable *hash;
- GRegex *r;
- GMatchInfo *match_info;
- guint idx = 1;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GHashTable *hash;
+ guint idx = 1;
g_return_val_if_fail (reply != NULL, NULL);
@@ -3544,12 +3468,7 @@ mm_3gpp_parse_cind_test_response (const gchar *reply,
reply++;
r = g_regex_new ("\\(([^,]*),\\((\\d+)[-,](\\d+).*\\)", G_REGEX_UNGREEDY, 0, NULL);
- if (!r) {
- g_set_error_literal (error,
- MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
- "Could not parse scan results.");
- return NULL;
- }
+ g_assert (r);
hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) cind_response_free);
@@ -3578,8 +3497,6 @@ mm_3gpp_parse_cind_test_response (const gchar *reply,
g_match_info_next (match_info, NULL);
}
}
- g_match_info_free (match_info);
- g_regex_unref (r);
return hash;
}
@@ -3590,11 +3507,11 @@ GByteArray *
mm_3gpp_parse_cind_read_response (const gchar *reply,
GError **error)
{
- GByteArray *array = NULL;
- GRegex *r = NULL;
- GMatchInfo *match_info;
- GError *inner_error = NULL;
- guint8 t;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GByteArray *array = NULL;
+ GError *inner_error = NULL;
+ guint8 t;
g_return_val_if_fail (reply != NULL, NULL);
@@ -3614,7 +3531,7 @@ mm_3gpp_parse_cind_read_response (const gchar *reply,
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Could not parse the +CIND response '%s': didn't match",
reply);
- goto done;
+ return NULL;
}
array = g_byte_array_sized_new (g_match_info_get_match_count (match_info));
@@ -3625,10 +3542,9 @@ mm_3gpp_parse_cind_read_response (const gchar *reply,
t = 0;
g_byte_array_append (array, &t, 1);
- while (!inner_error &&
- g_match_info_matches (match_info)) {
- gchar *str;
- guint val = 0;
+ while (!inner_error && g_match_info_matches (match_info)) {
+ g_autofree gchar *str = NULL;
+ guint val = 0;
str = g_match_info_fetch (match_info, 1);
if (mm_get_uint_from_str (str, &val) && val < 255) {
@@ -3639,21 +3555,14 @@ mm_3gpp_parse_cind_read_response (const gchar *reply,
"Could not parse the +CIND response: invalid index '%s'",
str);
}
-
- g_free (str);
g_match_info_next (match_info, NULL);
}
if (inner_error) {
g_propagate_error (error, inner_error);
- g_byte_array_unref (array);
- array = NULL;
+ g_clear_pointer (&array, g_byte_array_unref);
}
-done:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
return array;
}
@@ -3755,12 +3664,12 @@ mm_3gpp_parse_cgev_indication_pdp (const gchar *str,
guint *out_cid,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *inner_error = NULL;
- gchar *pdp_type = NULL;
- gchar *pdp_addr = NULL;
- guint cid = 0;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ gchar *pdp_type = NULL;
+ gchar *pdp_addr = NULL;
+ guint cid = 0;
g_assert (type == MM_3GPP_CGEV_REJECT ||
type == MM_3GPP_CGEV_NW_REACT ||
@@ -3772,6 +3681,7 @@ mm_3gpp_parse_cgev_indication_pdp (const gchar *str,
"NW REACT|"
"NW DEACT|ME DEACT"
")\\s*([^,]*),\\s*([^,]*)(?:,\\s*([0-9]+))?", 0, 0, NULL);
+ g_assert (r);
str = mm_strip_tag (str, "+CGEV:");
g_regex_match_full (r, str, strlen (str), 0, 0, &match_info, &inner_error);
@@ -3802,10 +3712,6 @@ mm_3gpp_parse_cgev_indication_pdp (const gchar *str,
}
out:
- if (match_info)
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
g_free (pdp_type);
g_free (pdp_addr);
@@ -3841,10 +3747,10 @@ mm_3gpp_parse_cgev_indication_primary (const gchar *str,
guint *out_cid,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *inner_error = NULL;
- guint cid = 0;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ guint cid = 0;
g_assert ((type == MM_3GPP_CGEV_NW_ACT_PRIMARY) ||
(type == MM_3GPP_CGEV_ME_ACT_PRIMARY) ||
@@ -3872,10 +3778,6 @@ mm_3gpp_parse_cgev_indication_primary (const gchar *str,
}
out:
- if (match_info)
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
g_propagate_error (error, inner_error);
return FALSE;
@@ -3900,12 +3802,12 @@ mm_3gpp_parse_cgev_indication_secondary (const gchar *str,
guint *out_event_type,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *inner_error = NULL;
- guint p_cid = 0;
- guint cid = 0;
- guint event_type = 0;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ guint p_cid = 0;
+ guint cid = 0;
+ guint event_type = 0;
g_assert (type == MM_3GPP_CGEV_NW_ACT_SECONDARY ||
type == MM_3GPP_CGEV_ME_ACT_SECONDARY ||
@@ -3943,10 +3845,6 @@ mm_3gpp_parse_cgev_indication_secondary (const gchar *str,
}
out:
- if (match_info)
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
g_propagate_error (error, inner_error);
return FALSE;
@@ -3980,10 +3878,10 @@ GList *
mm_3gpp_parse_pdu_cmgl_response (const gchar *str,
GError **error)
{
- GError *inner_error = NULL;
- GList *list = NULL;
- GMatchInfo *match_info;
- GRegex *r;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *inner_error = NULL;
+ GList *list = NULL;
/*
* +CMGL: <index>, <status>, [<alpha>], <length>
@@ -4016,9 +3914,6 @@ mm_3gpp_parse_pdu_cmgl_response (const gchar *str,
}
}
- g_match_info_free (match_info);
- g_regex_unref (r);
-
if (inner_error) {
g_propagate_error (error, inner_error);
mm_3gpp_pdu_info_list_free (list);
@@ -4754,10 +4649,10 @@ mm_cdma_parse_crm_test_response (const gchar *reply,
MMModemCdmaRmProtocol *max,
GError **error)
{
- gboolean result = FALSE;
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ gboolean result = FALSE;
+ GError *match_error = NULL;
/* Expected reply format is:
* ---> AT+CRM=?
@@ -4810,9 +4705,6 @@ mm_cdma_parse_crm_test_response (const gchar *reply,
reply);
}
- g_match_info_free (match_info);
- g_regex_unref (r);
-
return result;
}
@@ -5039,12 +4931,16 @@ mm_parse_cclk_response (const char *response,
MMNetworkTimezone **tzp,
GError **error)
{
- GRegex *r;
- GMatchInfo *match_info = NULL;
- GError *match_error = NULL;
- guint year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
- gint tz = 0;
- gboolean ret = FALSE;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ GError *match_error = NULL;
+ guint year = 0;
+ guint month = 0;
+ guint day = 0;
+ guint hour = 0;
+ guint minute = 0;
+ guint second = 0;
+ gint tz = 0;
g_assert (iso8601p || tzp); /* at least one */
@@ -5065,7 +4961,7 @@ mm_parse_cclk_response (const char *response,
MM_CORE_ERROR_FAILED,
"Couldn't match +CCLK reply: %s", response);
}
- goto out;
+ return FALSE;
}
/* Remember that g_match_info_get_match_count() includes match #0 */
@@ -5082,7 +4978,7 @@ mm_parse_cclk_response (const char *response,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Failed to parse +CCLK reply: %s", response);
- goto out;
+ return FALSE;
}
/* Read optional time zone offset; if not given assume UTC (tz = 0).
@@ -5094,7 +4990,7 @@ mm_parse_cclk_response (const char *response,
MM_CORE_ERROR,
MM_CORE_ERROR_FAILED,
"Failed to parse timezone in +CCLK reply: %s", response);
- goto out;
+ return FALSE;
}
/* Adjust year to support YYYY format, as per +CSDF in 3GPP TS 27.007. Also,
@@ -5112,22 +5008,16 @@ mm_parse_cclk_response (const char *response,
mm_network_timezone_set_offset (*tzp, tz * 15);
}
- ret = TRUE;
-
if (iso8601p) {
/* Return ISO-8601 format date/time string */
*iso8601p = mm_new_iso8601_time (year, month, day, hour,
minute, second,
TRUE, (tz * 15),
error);
- ret = (*iso8601p != NULL);
+ return (*iso8601p != NULL);
}
- out:
- g_match_info_free (match_info);
- g_regex_unref (r);
-
- return ret;
+ return TRUE;
}
/*****************************************************************************/
@@ -5139,12 +5029,12 @@ gint
mm_parse_csim_response (const gchar *response,
GError **error)
{
- GMatchInfo *match_info = NULL;
- GRegex *r = NULL;
- gchar *str_code = NULL;
- gint retries = -1;
- guint hex_code;
- GError *inner_error = NULL;
+ g_autoptr(GRegex) r = NULL;
+ g_autoptr(GMatchInfo) match_info = NULL;
+ g_autofree gchar *str_code = NULL;
+ gint retries = -1;
+ guint hex_code;
+ GError *inner_error = NULL;
r = g_regex_new ("\\+CSIM:\\s*[0-9]+,\\s*\".*([0-9a-fA-F]{4})\"", G_REGEX_RAW, 0, NULL);
g_regex_match (r, response, 0, &match_info);
@@ -5202,10 +5092,6 @@ mm_parse_csim_response (const gchar *response,
retries = (gint)(hex_code - MM_MIN_SIM_RETRY_HEX);
out:
- g_regex_unref (r);
- g_match_info_free (match_info);
- g_free (str_code);
-
if (inner_error) {
g_propagate_error (error, inner_error);
return -1;