diff --git a/src/regex-emacs.c b/src/regex-emacs.c index 9b2c14c413d..626560911f6 100644 --- a/src/regex-emacs.c +++ b/src/regex-emacs.c @@ -3446,14 +3446,18 @@ static bool bcmp_translate (re_char *, re_char *, ptrdiff_t, /* Call before fetching a character with *d. This switches over to string2 if necessary. + `reset' is executed before backtracking if there are no more characters. Check re_match_2_internal for a discussion of why end_match_2 might not be within string2 (but be equal to end_match_1 instead). */ -#define PREFETCH() \ +#define PREFETCH(reset) \ while (d == dend) \ { \ /* End of string2 => fail. */ \ if (dend == end_match_2) \ - goto fail; \ + { \ + reset; \ + goto fail; \ + } \ /* End of string1 => advance to string2. */ \ d = string2; \ dend = end_match_2; \ @@ -4252,7 +4256,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, int pat_charlen, buf_charlen; int pat_ch, buf_ch; - PREFETCH (); + PREFETCH (d = dfail); if (multibyte) pat_ch = string_char_and_length (p, &pat_charlen); else @@ -4280,7 +4284,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, int pat_charlen; int pat_ch, buf_ch; - PREFETCH (); + PREFETCH (d = dfail); if (multibyte) { pat_ch = string_char_and_length (p, &pat_charlen); @@ -4486,7 +4490,7 @@ re_match_2_internal (struct re_pattern_buffer *bufp, if (d2 == dend2) break; /* If necessary, advance to next segment in data. */ - PREFETCH (); + PREFETCH (d = dfail); /* How many characters left in this segment to match. */ dcnt = dend - d; diff --git a/test/src/regex-emacs-tests.el b/test/src/regex-emacs-tests.el index ff0d6be3f5d..b323f592dca 100644 --- a/test/src/regex-emacs-tests.el +++ b/test/src/regex-emacs-tests.el @@ -867,4 +867,9 @@ This evaluates the TESTS test cases from glibc." (should (equal (string-match "[[:lower:]]" "ẞ") 0)) (should (equal (string-match "[[:upper:]]" "ẞ") 0)))) +(ert-deftest regexp-atomic-failure () + "Bug#58726." + (should (equal (string-match "\\`\\(?:ab\\)*\\'" "a") nil)) + (should (equal (string-match "\\`a\\{2\\}*\\'" "a") nil))) + ;;; regex-emacs-tests.el ends here