diff --git a/glib/gregex.c b/glib/gregex.c index 219d9cee3..f2a5b5fd1 100644 --- a/glib/gregex.c +++ b/glib/gregex.c @@ -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; diff --git a/glib/tests/regex.c b/glib/tests/regex.c index 10daa7814..291c21b4c 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); }