aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii2012-12-11 17:30:45 +0200
committerEli Zaretskii2012-12-11 17:30:45 +0200
commite8c6e965f3043a68a76863081e4d096afc5bdf22 (patch)
tree96817ca02e074abe2c257e2e11534e5c1ddf8957
parent2c43a9adb2ba4904ac95e0d7be452536d003c37c (diff)
downloademacs-e8c6e965f3043a68a76863081e4d096afc5bdf22.tar.gz
emacs-e8c6e965f3043a68a76863081e4d096afc5bdf22.zip
Fix bug #13084 with crashes during search.
src/search.c (search_buffer): Check the inverse translations of each character in pattern when the buffer being searched is unibyte.
-rw-r--r--src/ChangeLog6
-rw-r--r--src/search.c16
2 files changed, 21 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index b3c7a5e6549..5239559f867 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,9 @@
12012-12-11 Eli Zaretskii <eliz@gnu.org>
2
3 * search.c (search_buffer): Check the inverse translations of each
4 character in pattern when the buffer being searched is unibyte.
5 (Bug#13084)
6
12012-12-10 Paul Eggert <eggert@cs.ucla.edu> 72012-12-10 Paul Eggert <eggert@cs.ucla.edu>
2 8
3 * fileio.c (Fvisited_file_modtime): Return (-1 ...) for nonexistent 9 * fileio.c (Fvisited_file_modtime): Return (-1 ...) for nonexistent
diff --git a/src/search.c b/src/search.c
index aacdbe33eef..7f26601cc69 100644
--- a/src/search.c
+++ b/src/search.c
@@ -1406,7 +1406,7 @@ search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte,
1406 char_base = 0; 1406 char_base = 0;
1407 while (--len >= 0) 1407 while (--len >= 0)
1408 { 1408 {
1409 int c, translated; 1409 int c, translated, inverse;
1410 1410
1411 /* If we got here and the RE flag is set, it's because we're 1411 /* If we got here and the RE flag is set, it's because we're
1412 dealing with a regexp known to be trivial, so the backslash 1412 dealing with a regexp known to be trivial, so the backslash
@@ -1420,6 +1420,20 @@ search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte,
1420 c = *base_pat++; 1420 c = *base_pat++;
1421 TRANSLATE (translated, trt, c); 1421 TRANSLATE (translated, trt, c);
1422 *pat++ = translated; 1422 *pat++ = translated;
1423 /* Check that none of C's equivalents violates the
1424 assumptions of boyer_moore. */
1425 TRANSLATE (inverse, inverse_trt, c);
1426 while (1)
1427 {
1428 if (inverse >= 0200)
1429 {
1430 boyer_moore_ok = 0;
1431 break;
1432 }
1433 if (c == inverse)
1434 break;
1435 TRANSLATE (inverse, inverse_trt, inverse);
1436 }
1423 } 1437 }
1424 } 1438 }
1425 1439