Fix access to single-byte characters in buffer text

* src/xdisp.c (get_visually_first_element)
(Fbidi_find_overridden_directionality):
* src/cmds.c (Fend_of_line): Use FETCH_BYTE instead of FETCH_CHAR,
and byte position instead of character position, to access
individual bytes of buffer text.  This avoids producing invalid
characters and accessing wrong buffer positions.  (Bug#41520)
This commit is contained in:
Eli Zaretskii 2020-05-25 17:07:22 +03:00
parent 478638e470
commit df91c94ca8
2 changed files with 5 additions and 5 deletions

View file

@ -203,7 +203,7 @@ to t. */)
SET_PT (newpos); SET_PT (newpos);
if (PT > newpos if (PT > newpos
&& FETCH_CHAR (PT - 1) == '\n') && FETCH_BYTE (PT_BYTE - 1) == '\n')
{ {
/* If we skipped over a newline that follows /* If we skipped over a newline that follows
an invisible intangible run, an invisible intangible run,
@ -214,7 +214,7 @@ to t. */)
break; break;
} }
else if (PT > newpos && PT < ZV else if (PT > newpos && PT < ZV
&& FETCH_CHAR (PT) != '\n') && FETCH_BYTE (PT_BYTE) != '\n')
/* If we skipped something intangible /* If we skipped something intangible
and now we're not really at eol, and now we're not really at eol,
keep going. */ keep going. */

View file

@ -8264,8 +8264,8 @@ get_visually_first_element (struct it *it)
} }
else if (it->bidi_it.charpos == bob else if (it->bidi_it.charpos == bob
|| (!string_p || (!string_p
&& (FETCH_CHAR (it->bidi_it.bytepos - 1) == '\n' && (FETCH_BYTE (it->bidi_it.bytepos - 1) == '\n'
|| FETCH_CHAR (it->bidi_it.bytepos) == '\n'))) || FETCH_BYTE (it->bidi_it.bytepos) == '\n')))
{ {
/* If we are at the beginning of a line/string, we can produce /* If we are at the beginning of a line/string, we can produce
the next element right away. */ the next element right away. */
@ -24157,7 +24157,7 @@ the `bidi-class' property of a character. */)
itb.charpos = BEGV; itb.charpos = BEGV;
itb.bytepos = BEGV_BYTE; itb.bytepos = BEGV_BYTE;
} }
else if (FETCH_CHAR (from_bpos - 1) == '\n') else if (FETCH_BYTE (from_bpos - 1) == '\n')
{ {
itb.charpos = from_pos; itb.charpos = from_pos;
itb.bytepos = from_bpos; itb.bytepos = from_bpos;