diff options
| author | Eli Zaretskii | 2012-12-11 17:30:45 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2012-12-11 17:30:45 +0200 |
| commit | e8c6e965f3043a68a76863081e4d096afc5bdf22 (patch) | |
| tree | 96817ca02e074abe2c257e2e11534e5c1ddf8957 | |
| parent | 2c43a9adb2ba4904ac95e0d7be452536d003c37c (diff) | |
| download | emacs-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/ChangeLog | 6 | ||||
| -rw-r--r-- | src/search.c | 16 |
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 @@ | |||
| 1 | 2012-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 | |||
| 1 | 2012-12-10 Paul Eggert <eggert@cs.ucla.edu> | 7 | 2012-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 | ||