[glib/wip/3v1n0/regex-pcre2-flags-fixes: 5/11] gregex: Do not try access the undefined match offsets if we have no match
- From: Marco Trevisan <marcotrevi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/3v1n0/regex-pcre2-flags-fixes: 5/11] gregex: Do not try access the undefined match offsets if we have no match
- Date: Tue, 6 Sep 2022 20:17:53 +0000 (UTC)
commit c61e38e661ad356d3c3a77d5b900ba40414e847e
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date: Tue Sep 6 17:16:07 2022 +0200
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.
glib/gregex.c | 6 ++++++
glib/tests/regex.c | 6 ++++++
2 files changed, 12 insertions(+)
---
diff --git a/glib/gregex.c b/glib/gregex.c
index a5e2d95764..340a7570c5 100644
--- a/glib/gregex.c
+++ b/glib/gregex.c
@@ -1083,6 +1083,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;
diff --git a/glib/tests/regex.c b/glib/tests/regex.c
index 10daa7814a..291c21b4c7 100644
--- a/glib/tests/regex.c
+++ b/glib/tests/regex.c
@@ -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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]