diff options
| author | Eli Zaretskii | 2020-09-19 19:54:01 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2020-09-19 19:54:01 +0300 |
| commit | df04f3e755f3001ebb9cc428faa7fa46059e636b (patch) | |
| tree | acf478dc8aca3749f10ad6f9d5527cc29b05ed4c /src/syntax.c | |
| parent | fd1fe1e1ecb6c68bbdea4bf071166779388174d0 (diff) | |
| download | emacs-df04f3e755f3001ebb9cc428faa7fa46059e636b.tar.gz emacs-df04f3e755f3001ebb9cc428faa7fa46059e636b.zip | |
Fix a rare segfault in syntax.c
* src/syntax.c (Fforward_comment): Prevent the loop for COUNT < 0
from going outside the valid range of character/byte positions.
(Bug#43499)
* doc/lispref/syntax.texi (Syntax Class Table): Mention the
"comment-fence" and "string-fence" as alternative names of 2
syntax classes.
Diffstat (limited to 'src/syntax.c')
| -rw-r--r-- | src/syntax.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/syntax.c b/src/syntax.c index a79ab863367..e8b32f5a445 100644 --- a/src/syntax.c +++ b/src/syntax.c | |||
| @@ -2545,20 +2545,23 @@ between them, return t; otherwise return nil. */) | |||
| 2545 | bool fence_found = 0; | 2545 | bool fence_found = 0; |
| 2546 | ptrdiff_t ini = from, ini_byte = from_byte; | 2546 | ptrdiff_t ini = from, ini_byte = from_byte; |
| 2547 | 2547 | ||
| 2548 | while (1) | 2548 | if (from > stop) |
| 2549 | { | 2549 | { |
| 2550 | DEC_BOTH (from, from_byte); | 2550 | while (1) |
| 2551 | UPDATE_SYNTAX_TABLE_BACKWARD (from); | ||
| 2552 | c = FETCH_CHAR_AS_MULTIBYTE (from_byte); | ||
| 2553 | if (SYNTAX (c) == Scomment_fence | ||
| 2554 | && !char_quoted (from, from_byte)) | ||
| 2555 | { | 2551 | { |
| 2556 | fence_found = 1; | 2552 | DEC_BOTH (from, from_byte); |
| 2557 | break; | 2553 | UPDATE_SYNTAX_TABLE_BACKWARD (from); |
| 2554 | c = FETCH_CHAR_AS_MULTIBYTE (from_byte); | ||
| 2555 | if (SYNTAX (c) == Scomment_fence | ||
| 2556 | && !char_quoted (from, from_byte)) | ||
| 2557 | { | ||
| 2558 | fence_found = 1; | ||
| 2559 | break; | ||
| 2560 | } | ||
| 2561 | else if (from == stop) | ||
| 2562 | break; | ||
| 2563 | rarely_quit (++quit_count); | ||
| 2558 | } | 2564 | } |
| 2559 | else if (from == stop) | ||
| 2560 | break; | ||
| 2561 | rarely_quit (++quit_count); | ||
| 2562 | } | 2565 | } |
| 2563 | if (fence_found == 0) | 2566 | if (fence_found == 0) |
| 2564 | { | 2567 | { |