]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix ungetc bug when reading an encoding error
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 8 Jul 2017 01:08:00 +0000 (18:08 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 8 Jul 2017 01:09:33 +0000 (18:09 -0700)
* src/lread.c (readchar, read_emacs_mule_char): Fix off-by-one
error when reading an encoding error from a file, e.g., a symbol
in an .elc file whose name is "\360\220\200\360".

src/lread.c

index 7c554ba853631cfc6f26a43d0ead6882b11cd662..44eaf13996aa7c9cf395c5822f9434277ef2c88c 100644 (file)
@@ -340,14 +340,13 @@ readchar (Lisp_Object readcharfun, bool *multibyte)
   len = BYTES_BY_CHAR_HEAD (c);
   while (i < len)
     {
-      c = (*readbyte) (-1, readcharfun);
+      buf[i++] = c = (*readbyte) (-1, readcharfun);
       if (c < 0 || ! TRAILING_CODE_P (c))
        {
-         while (--i > 1)
+         for (i -= c < 0; 0 < --i; )
            (*readbyte) (buf[i], readcharfun);
          return BYTE8_TO_CHAR (buf[0]);
        }
-      buf[i++] = c;
     }
   return STRING_CHAR (buf);
 }
@@ -530,14 +529,13 @@ read_emacs_mule_char (int c, int (*readbyte) (int, Lisp_Object), Lisp_Object rea
   buf[i++] = c;
   while (i < len)
     {
-      c = (*readbyte) (-1, readcharfun);
+      buf[i++] = c = (*readbyte) (-1, readcharfun);
       if (c < 0xA0)
        {
-         while (--i > 1)
+         for (i -= c < 0; 0 < --i; )
            (*readbyte) (buf[i], readcharfun);
          return BYTE8_TO_CHAR (buf[0]);
        }
-      buf[i++] = c;
     }
 
   if (len == 2)