aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2020-09-19 19:54:01 +0300
committerEli Zaretskii2020-09-19 19:54:01 +0300
commitdf04f3e755f3001ebb9cc428faa7fa46059e636b (patch)
treeacf478dc8aca3749f10ad6f9d5527cc29b05ed4c /src
parentfd1fe1e1ecb6c68bbdea4bf071166779388174d0 (diff)
downloademacs-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')
-rw-r--r--src/syntax.c25
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 {