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.
This commit is contained in:
Eli Zaretskii 2020-09-19 19:54:01 +03:00
parent fd1fe1e1ec
commit df04f3e755
2 changed files with 24 additions and 19 deletions

View file

@ -256,10 +256,11 @@ look in the standard syntax table to find the syntax of this
character. character.
@item Generic comment delimiters: @samp{!} @item Generic comment delimiters: @samp{!}
Characters that start or end a special kind of comment. @emph{Any} (This syntax class is also known as ``comment-fence''.) Characters
generic comment delimiter matches @emph{any} generic comment that start or end a special kind of comment. @emph{Any} generic
delimiter, but they cannot match a comment starter or comment ender; comment delimiter matches @emph{any} generic comment delimiter, but
generic comment delimiters can only match each other. they cannot match a comment starter or comment ender; generic comment
delimiters can only match each other.
This syntax class is primarily meant for use with the This syntax class is primarily meant for use with the
@code{syntax-table} text property (@pxref{Syntax Properties}). You @code{syntax-table} text property (@pxref{Syntax Properties}). You
@ -268,10 +269,11 @@ first and last characters of the range @code{syntax-table} properties
identifying them as generic comment delimiters. identifying them as generic comment delimiters.
@item Generic string delimiters: @samp{|} @item Generic string delimiters: @samp{|}
Characters that start or end a string. This class differs from the (This syntax class is also known as ``string-fence''.) Characters
string quote class in that @emph{any} generic string delimiter can that start or end a string. This class differs from the string quote
match any other generic string delimiter; but they do not match class in that @emph{any} generic string delimiter can match any other
ordinary string quote characters. generic string delimiter; but they do not match ordinary string quote
characters.
This syntax class is primarily meant for use with the This syntax class is primarily meant for use with the
@code{syntax-table} text property (@pxref{Syntax Properties}). You @code{syntax-table} text property (@pxref{Syntax Properties}). You

View file

@ -2545,20 +2545,23 @@ between them, return t; otherwise return nil. */)
bool fence_found = 0; bool fence_found = 0;
ptrdiff_t ini = from, ini_byte = from_byte; ptrdiff_t ini = from, ini_byte = from_byte;
while (1) if (from > stop)
{ {
DEC_BOTH (from, from_byte); while (1)
UPDATE_SYNTAX_TABLE_BACKWARD (from);
c = FETCH_CHAR_AS_MULTIBYTE (from_byte);
if (SYNTAX (c) == Scomment_fence
&& !char_quoted (from, from_byte))
{ {
fence_found = 1; DEC_BOTH (from, from_byte);
break; UPDATE_SYNTAX_TABLE_BACKWARD (from);
c = FETCH_CHAR_AS_MULTIBYTE (from_byte);
if (SYNTAX (c) == Scomment_fence
&& !char_quoted (from, from_byte))
{
fence_found = 1;
break;
}
else if (from == stop)
break;
rarely_quit (++quit_count);
} }
else if (from == stop)
break;
rarely_quit (++quit_count);
} }
if (fence_found == 0) if (fence_found == 0)
{ {