Another stability fix in 'lisp_string_width'
authorEli Zaretskii <eliz@gnu.org>
Fri, 28 May 2021 11:03:16 +0000 (14:03 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 28 May 2021 11:03:16 +0000 (14:03 +0300)
* src/character.c (lisp_string_width): Compute C pointer to data
of STRING immediately before using it, since STRING could be
relocated by GC triggered by processing compositions.  (Bug#48711)

src/character.c

index e44ab8d43b18c969e12a135e30a7e5f3aa839ecd..e874cf5e53ca3d621e64f115e28ab961dca95df4 100644 (file)
@@ -339,7 +339,6 @@ lisp_string_width (Lisp_Object string, ptrdiff_t from, ptrdiff_t to,
      contains only ascii and eight-bit-graphic, but that's
      intentional.  */
   bool multibyte = SCHARS (string) < SBYTES (string);
-  unsigned char *str = SDATA (string);
   ptrdiff_t i = from, i_byte = from ? string_char_to_byte (string, from) : 0;
   ptrdiff_t from_byte = i_byte;
   ptrdiff_t width = 0;
@@ -414,6 +413,7 @@ lisp_string_width (Lisp_Object string, ptrdiff_t from, ptrdiff_t to,
       else
        {
          int c;
+         unsigned char *str = SDATA (string);
 
          if (multibyte)
            {