gregex: Handle the case we need to re-allocate the match data

In case PCRE2 returns an empty match

This can be easily tested by initializing the initial match data to a
value that is less than the expected match values (e.g. by calling
pcre2_match_data_create (1, NULL)), but we can't do it in our tests
without bigger changes.
This commit is contained in:
Marco Trevisan (Treviño) 2022-09-06 18:26:12 +02:00
parent 1d628dac92
commit 11521972f4

View File

@ -1027,7 +1027,7 @@ g_match_info_next (GMatchInfo *match_info,
{ {
gint prev_match_start; gint prev_match_start;
gint prev_match_end; gint prev_match_end;
gint opts; uint32_t opts;
g_return_val_if_fail (match_info != NULL, FALSE); g_return_val_if_fail (match_info != NULL, FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
@ -1075,6 +1075,19 @@ g_match_info_next (GMatchInfo *match_info,
match_info->regex->pattern, match_error (match_info->matches)); match_info->regex->pattern, match_error (match_info->matches));
return FALSE; return FALSE;
} }
else if (match_info->matches == 0)
{
/* info->offsets is too small. */
match_info->n_offsets *= 2;
match_info->offsets = g_realloc_n (match_info->offsets,
match_info->n_offsets,
sizeof (gint));
pcre2_match_data_free (match_info->match_data);
match_info->match_data = pcre2_match_data_create (match_info->n_offsets, NULL);
return g_match_info_next (match_info, error);
}
else if (match_info->matches == PCRE2_ERROR_NOMATCH) else if (match_info->matches == PCRE2_ERROR_NOMATCH)
{ {
/* We're done with this match info */ /* We're done with this match info */