diff options
author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2022-09-06 17:20:45 +0200 |
---|---|---|
committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2022-09-12 13:55:39 +0200 |
commit | 13ad4296ea8ba66f5620288b2fd06315852e73ae (patch) | |
tree | 0c8a9272236ab8c203f40e7ea3a7b669cbdec0e2 /glib/gregex.c | |
parent | 1f88976610d5bcc15ad58c9345848d736d64fd55 (diff) | |
download | glib-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.c | 12 |
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); |