diff options
author | Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br> | 2008-07-01 18:17:44 -0300 |
---|---|---|
committer | Paulo Cesar Pereira de Andrade <pcpa@mandriva.com.br> | 2008-07-01 18:17:44 -0300 |
commit | 618a07e8131f49bbda77d2cfe5832218a561a5c8 (patch) | |
tree | ec6ea4a3fffdc9fad7dc8bab3cbdc66673cf292d /lisp/re | |
parent | 946b5b745d9d326799a23f7210b799e1b690643d (diff) |
Fix a bug in the regex library
The bug causes the regex parser to enter an infinite loop with certain
special patterns with alternatives. Test cases also added to ensure
the bug will be triggered by the tests if it is somehow reinstantiated.
Also testing commit to xedit git repository.
Diffstat (limited to 'lisp/re')
-rw-r--r-- | lisp/re/re.c | 3 | ||||
-rw-r--r-- | lisp/re/tests.c | 2 | ||||
-rw-r--r-- | lisp/re/tests.txt | 9 |
3 files changed, 12 insertions, 2 deletions
diff --git a/lisp/re/re.c b/lisp/re/re.c index abf5cc4..fca7e28 100644 --- a/lisp/re/re.c +++ b/lisp/re/re.c @@ -782,7 +782,8 @@ next_lcstl:; case Re_AltNext: bas = eng.off - 1; /* Check if matched and if it is a better match */ - if (eng.sv[eng.off] - eng.so[eng.off] < + if (eng.eo[eng.off] >= eng.so[eng.off] && + eng.sv[eng.off] - eng.so[eng.off] < eng.eo[eng.off] - eng.so[eng.off]) eng.sv[eng.off] = eng.eo[eng.off]; diff --git a/lisp/re/tests.c b/lisp/re/tests.c index 6a82d41..21b1e10 100644 --- a/lisp/re/tests.c +++ b/lisp/re/tests.c @@ -164,7 +164,7 @@ main(int argc, char *argv[]) else { if (failed) { reerror(failed, &cod, buf, sizeof(buf)); - fprintf(stderr, "%s, at line %d\n", line); + fprintf(stderr, "%s, at line %d\n", buf, line); break; } if (sscanf(buf, "%ld,%ld:", &so, &eo) != 2) { diff --git a/lisp/re/tests.txt b/lisp/re/tests.txt index b8d3e22..35fd90b 100644 --- a/lisp/re/tests.txt +++ b/lisp/re/tests.txt @@ -459,3 +459,12 @@ /.*(\d+)/ :BADRPT + +# Regression fix, was matching empty string +/\\\d{3}|\\./ +>\\ +:NOMATCH + +/\\.|\\\d{3}/ +>\\ +:NOMATCH |