]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix access to single-byte characters in buffer text
authorEli Zaretskii <eliz@gnu.org>
Mon, 25 May 2020 14:07:22 +0000 (17:07 +0300)
committerEli Zaretskii <eliz@gnu.org>
Mon, 25 May 2020 14:07:22 +0000 (17:07 +0300)
* 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)

src/cmds.c
src/xdisp.c

index 5d7a45e65f632379239820a984e4d20d245cc979..9914b7a01f79148cf2f4c09fd4be1155b22e05db 100644 (file)
@@ -203,7 +203,7 @@ to t.  */)
       SET_PT (newpos);
 
       if (PT > newpos
-         && FETCH_CHAR (PT - 1) == '\n')
+         && FETCH_BYTE (PT_BYTE - 1) == '\n')
        {
          /* If we skipped over a newline that follows
             an invisible intangible run,
@@ -214,7 +214,7 @@ to t.  */)
          break;
        }
       else if (PT > newpos && PT < ZV
-              && FETCH_CHAR (PT) != '\n')
+              && FETCH_BYTE (PT_BYTE) != '\n')
        /* If we skipped something intangible
           and now we're not really at eol,
           keep going.  */
index 1e865898e370a86379b360b9f5dc812dbb7671e4..bff6218106bd9637917c12ab36f955a699294251 100644 (file)
@@ -8264,8 +8264,8 @@ get_visually_first_element (struct it *it)
     }
   else if (it->bidi_it.charpos == bob
           || (!string_p
-              && (FETCH_CHAR (it->bidi_it.bytepos - 1) == '\n'
-                  || FETCH_CHAR (it->bidi_it.bytepos) == '\n')))
+              && (FETCH_BYTE (it->bidi_it.bytepos - 1) == '\n'
+                  || FETCH_BYTE (it->bidi_it.bytepos) == '\n')))
     {
       /* If we are at the beginning of a line/string, we can produce
         the next element right away.  */
@@ -24157,7 +24157,7 @@ the `bidi-class' property of a character.  */)
          itb.charpos = BEGV;
          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.bytepos = from_bpos;