summaryrefslogtreecommitdiff
path: root/glib/gregex.c
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2022-09-06 17:20:45 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2022-09-12 13:55:39 +0200
commit13ad4296ea8ba66f5620288b2fd06315852e73ae (patch)
tree0c8a9272236ab8c203f40e7ea3a7b669cbdec0e2 /glib/gregex.c
parent1f88976610d5bcc15ad58c9345848d736d64fd55 (diff)
downloadglib-13ad4296ea8ba66f5620288b2fd06315852e73ae.tar.gz
gregex: Fix a potential PCRE2 code leak on reallocation failures
In case recalc_match_offsets() failed we were just returning, but in such case, per the documentation we should still set the match_info (if provided) and free the pcre2 code instance. So let's just break the loop we're in it, as if we we've no matches set. This also avoids re-allocating the offsets array and potentially accessing to unset data.
Diffstat (limited to 'glib/gregex.c')
-rw-r--r--glib/gregex.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/glib/gregex.c b/glib/gregex.c
index f2a5b5fd1..6f3ee8812 100644
--- a/glib/gregex.c
+++ b/glib/gregex.c
@@ -2337,13 +2337,6 @@ g_regex_match_all_full (const GRegex *regex,
info->match_data,
info->match_context,
info->workspace, info->n_workspace);
-
- if (!recalc_match_offsets (info, error))
- {
- g_match_info_free (info);
- return FALSE;
- }
-
if (info->matches == PCRE2_ERROR_DFA_WSSIZE)
{
/* info->workspace is too small. */
@@ -2370,6 +2363,11 @@ g_regex_match_all_full (const GRegex *regex,
_("Error while matching regular expression %s: %s"),
regex->pattern, match_error (info->matches));
}
+ else if (info->matches > 0)
+ {
+ if (!recalc_match_offsets (info, error))
+ info->matches = PCRE2_ERROR_NOMATCH;
+ }
}
pcre2_code_free (pcre_re);