gregex: Do not try access the undefined match offsets if we have no match

In case we're getting NO-MATCH "errors", we were still recomputing the
match offsets and taking decisions based on that, that might lead to
undefined behavior.

Avoid this by just returning early a FALSE result (but with no error) in
case there's no result to proceed on.

Fixes: #2741
This commit is contained in:
Marco Trevisan (Treviño) 2022-09-06 17:16:07 +02:00
parent 1185a1304a
commit 1f88976610
2 changed files with 12 additions and 0 deletions

View File

@ -1073,6 +1073,12 @@ g_match_info_next (GMatchInfo *match_info,
match_info->regex->pattern, match_error (match_info->matches));
return FALSE;
}
else if (match_info->matches == PCRE2_ERROR_NOMATCH)
{
/* We're done with this match info */
match_info->pos = -1;
return FALSE;
}
else
if (!recalc_match_offsets (match_info, error))
return FALSE;

View File

@ -1669,6 +1669,12 @@ test_class (void)
res = g_match_info_next (match, NULL);
g_assert (!res);
/* Accessing match again should not crash */
g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL,
"*match_info->pos >= 0*");
g_assert_false (g_match_info_next (match, NULL));
g_test_assert_expected_messages ();
g_match_info_free (match);
g_regex_unref (regex);
}