]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug #11073 with bidi-related crashes displaying some byte sequences.
authorEli Zaretskii <eliz@gnu.org>
Fri, 23 Mar 2012 12:32:23 +0000 (14:32 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 23 Mar 2012 12:32:23 +0000 (14:32 +0200)
 src/bidi.c (bidi_fetch_char): Use STRING_CHAR_AND_LENGTH instead of
 FETCH_MULTIBYTE_CHAR followed by CHAR_BYTES.  Prevents crashes
 when fetching a multibyte character consumes more bytes than
 CHAR_BYTES returns, due to unification of CJK characters in
 string_char.

src/ChangeLog
src/bidi.c

index 40186c6549665c6f67eeb693deb8d092ecedce9a..028b8325aae3809ed66b2b57a0cb9cac5c93a949 100644 (file)
@@ -1,3 +1,11 @@
+2012-03-23  Eli Zaretskii  <eliz@gnu.org>
+
+       * bidi.c (bidi_fetch_char): Use STRING_CHAR_AND_LENGTH instead of
+       FETCH_MULTIBYTE_CHAR followed by CHAR_BYTES.  Prevents crashes
+       when fetching a multibyte character consumes more bytes than
+       CHAR_BYTES returns, due to unification of CJK characters in
+       string_char.  (Bug#11073)
+
 2012-03-23  Troels Nielsen  <bn.troels@gmail.com>  (tiny change)
 
        * process.c (wait_reading_process_output): Handle pty disconnect
index 107c817abba9f306154e52c77c29b625467c182e..b3479b17b168a3177f599d77b7c15cab7bcfab48 100644 (file)
@@ -932,6 +932,7 @@ bidi_fetch_char (EMACS_INT bytepos, EMACS_INT charpos, EMACS_INT *disp_pos,
   EMACS_INT endpos
     = (string->s || STRINGP (string->lstring)) ? string->schars : ZV;
   struct text_pos pos;
+  int len;
 
   /* If we got past the last known position of display string, compute
      the position of the next one.  That position could be at CHARPOS.  */
@@ -1003,7 +1004,6 @@ bidi_fetch_char (EMACS_INT bytepos, EMACS_INT charpos, EMACS_INT *disp_pos,
     normal_char:
       if (string->s)
        {
-         int len;
 
          if (!string->unibyte)
            {
@@ -1018,8 +1018,6 @@ bidi_fetch_char (EMACS_INT bytepos, EMACS_INT charpos, EMACS_INT *disp_pos,
        }
       else if (STRINGP (string->lstring))
        {
-         int len;
-
          if (!string->unibyte)
            {
              ch = STRING_CHAR_AND_LENGTH (SDATA (string->lstring) + bytepos,
@@ -1034,8 +1032,8 @@ bidi_fetch_char (EMACS_INT bytepos, EMACS_INT charpos, EMACS_INT *disp_pos,
        }
       else
        {
-         ch = FETCH_MULTIBYTE_CHAR (bytepos);
-         *ch_len = CHAR_BYTES (ch);
+         ch = STRING_CHAR_AND_LENGTH (BYTE_POS_ADDR (bytepos), len);
+         *ch_len = len;
        }
       *nchars = 1;
     }