core: ensure that GMatchInfo and GRegex objects are freed properly
In particular, g_regex_match() and g_regex_match_full() allocate a match_info structure on both success and failure, so calling g_match_info_free() only in the success case is insufficient. BUG=None TEST=Inspection Change-Id: Iea76b5b5dc3ec48120e15601a5e2dd45322133d8
This commit is contained in:
committed by
Dan Williams
parent
00670456ff
commit
8710820156
@@ -183,6 +183,9 @@ evdo_state_done (MMAtSerialPort *port,
|
||||
}
|
||||
}
|
||||
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (r);
|
||||
|
||||
done:
|
||||
mm_generic_cdma_query_reg_state_set_callback_evdo_state (info, reg_state);
|
||||
mm_callback_info_schedule (info);
|
||||
@@ -254,6 +257,9 @@ state_done (MMAtSerialPort *port,
|
||||
}
|
||||
}
|
||||
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (r);
|
||||
|
||||
mm_generic_cdma_query_reg_state_set_callback_1x_state (info, reg_state);
|
||||
|
||||
/* Try for EVDO state too */
|
||||
|
||||
@@ -652,6 +652,9 @@ get_smong_cb (MMAtSerialPort *port,
|
||||
priv->sind_psinfo = TRUE;
|
||||
}
|
||||
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (regex);
|
||||
|
||||
mm_callback_info_set_result (info, GUINT_TO_POINTER (act), NULL);
|
||||
mm_callback_info_schedule (info);
|
||||
}
|
||||
@@ -698,12 +701,14 @@ get_sind_cb (MMAtSerialPort *port,
|
||||
g_free (ind_value);
|
||||
mm_callback_info_set_result (info, GUINT_TO_POINTER (act), NULL);
|
||||
mm_callback_info_schedule (info);
|
||||
return;
|
||||
} else {
|
||||
/* If there was no 'psinfo' indicator, we'll try AT^SMONG and read the cell
|
||||
* info table. */
|
||||
mm_at_serial_port_queue_command (port, "^SMONG", 3, get_smong_cb, info);
|
||||
}
|
||||
|
||||
/* If there was no 'psinfo' indicator, we'll try AT^SMONG and read the cell
|
||||
* info table. */
|
||||
mm_at_serial_port_queue_command (port, "^SMONG", 3, get_smong_cb, info);
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (regex);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -599,9 +599,9 @@ send_huawei_cpin_done (MMAtSerialPort *port,
|
||||
|
||||
mm_callback_info_set_result (info, GUINT_TO_POINTER (attempts_left), NULL);
|
||||
|
||||
g_match_info_free (match_info);
|
||||
|
||||
done:
|
||||
if (match_info)
|
||||
g_match_info_free (match_info);
|
||||
if (r)
|
||||
g_regex_unref (r);
|
||||
mm_serial_port_close (MM_SERIAL_PORT (port));
|
||||
|
||||
@@ -198,8 +198,6 @@ parse_nwrat_response (GString *response,
|
||||
mode = atoi (str);
|
||||
g_free (str);
|
||||
|
||||
g_match_info_free (match_info);
|
||||
|
||||
if (mode < 0 || mode > 2) {
|
||||
g_set_error_literal (error, MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL,
|
||||
"Failed to parse mode/tech response");
|
||||
@@ -219,6 +217,7 @@ parse_nwrat_response (GString *response,
|
||||
success = TRUE;
|
||||
|
||||
out:
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (r);
|
||||
return success;
|
||||
}
|
||||
|
||||
@@ -357,9 +357,9 @@ send_samsung_pinnum_done (MMAtSerialPort *port,
|
||||
|
||||
mm_callback_info_set_result (info, GUINT_TO_POINTER (attempts_left), NULL);
|
||||
|
||||
g_match_info_free (match_info);
|
||||
|
||||
done:
|
||||
if (match_info)
|
||||
g_match_info_free (match_info);
|
||||
if (r)
|
||||
g_regex_unref (r);
|
||||
mm_serial_port_close (MM_SERIAL_PORT (port));
|
||||
|
||||
@@ -73,7 +73,7 @@ get_allowed_mode_done (MMAtSerialPort *port,
|
||||
{
|
||||
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
|
||||
GRegex *r = NULL;
|
||||
GMatchInfo *match_info;
|
||||
GMatchInfo *match_info = NULL;
|
||||
|
||||
/* If the modem has already been removed, return without
|
||||
* scheduling callback */
|
||||
@@ -128,6 +128,8 @@ get_allowed_mode_done (MMAtSerialPort *port,
|
||||
}
|
||||
|
||||
done:
|
||||
if (match_info)
|
||||
g_match_info_free (match_info);
|
||||
if (r)
|
||||
g_regex_unref (r);
|
||||
mm_callback_info_schedule (info);
|
||||
|
||||
@@ -81,8 +81,6 @@ parse_syssel_response (GString *response,
|
||||
mode = atoi (str);
|
||||
g_free (str);
|
||||
|
||||
g_match_info_free (match_info);
|
||||
|
||||
if (mode < 0 || mode > 2) {
|
||||
g_set_error_literal (error, MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL,
|
||||
"Failed to parse mode/tech response");
|
||||
@@ -102,6 +100,7 @@ parse_syssel_response (GString *response,
|
||||
success = TRUE;
|
||||
|
||||
out:
|
||||
g_match_info_free (match_info);
|
||||
g_regex_unref (r);
|
||||
return success;
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ get_allowed_mode_done (MMAtSerialPort *port,
|
||||
{
|
||||
MMCallbackInfo *info = (MMCallbackInfo *) user_data;
|
||||
GRegex *r = NULL;
|
||||
GMatchInfo *match_info;
|
||||
GMatchInfo *match_info = NULL;
|
||||
|
||||
/* If the modem has already been removed, return without
|
||||
* scheduling callback */
|
||||
@@ -138,8 +138,6 @@ get_allowed_mode_done (MMAtSerialPort *port,
|
||||
pref_acq = atoi (str);
|
||||
g_free (str);
|
||||
|
||||
g_match_info_free (match_info);
|
||||
|
||||
if (cm_mode < 0 || cm_mode > 2 || pref_acq < 0 || pref_acq > 2) {
|
||||
info->error = g_error_new (MM_MODEM_ERROR,
|
||||
MM_MODEM_ERROR_GENERAL,
|
||||
@@ -164,6 +162,8 @@ get_allowed_mode_done (MMAtSerialPort *port,
|
||||
}
|
||||
|
||||
done:
|
||||
if (match_info)
|
||||
g_match_info_free (match_info);
|
||||
if (r)
|
||||
g_regex_unref (r);
|
||||
mm_callback_info_schedule (info);
|
||||
|
||||
Reference in New Issue
Block a user