]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2010-02-06 Vladimir Serbinenko <phcoder@gmail.com>
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 6 Feb 2010 22:39:14 +0000 (23:39 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 6 Feb 2010 22:39:14 +0000 (23:39 +0100)
* kern/misc.c (grub_utf8_to_ucs4): Don't eat valid characters preceeded
by non-valid ones.
* kern/term.c (grub_putchar): Likewise.

ChangeLog
kern/misc.c
kern/term.c

index 8de063bf2c804b0937337706fb7cf8df4489dc4b..e71065338c92690580caca0dd02a1726be70787b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-02-06  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * kern/misc.c (grub_utf8_to_ucs4): Don't eat valid characters preceeded
+       by non-valid ones.
+       * kern/term.c (grub_putchar): Likewise.
+
 2010-02-06  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * partmap/sun.c (sun_partition_map_iterate): Restructure flow to fix
index 309267786d4bd18c43dc10715691e0550bbf65b9..f45991d96b54dd78ad673e8e087611ec0e1fde5b 100644 (file)
@@ -971,6 +971,10 @@ grub_utf8_to_ucs4 (grub_uint32_t *dest, grub_size_t destsize,
            {
              /* invalid */
              code = '?';
+             /* Character c may be valid, don't eat it.  */
+             src--;
+             if (srcsize != (grub_size_t)-1)
+               srcsize++;
              count = 0;
            }
          else
index b381d9336933efce237d9642da862e35230b3ebb..6e3a2b45409b0dc5d9f6fd8b325592e3e6e7df26 100644 (file)
@@ -57,16 +57,17 @@ grub_putchar (int c)
 {
   static grub_size_t size = 0;
   static grub_uint8_t buf[6];
+  grub_uint8_t *rest;
   grub_uint32_t code;
-  grub_size_t ret;
 
   buf[size++] = c;
-  ret = grub_utf8_to_ucs4 (&code, 1, buf, size, 0);
 
-  if (ret != 0)
+  while (grub_utf8_to_ucs4 (&code, 1, buf, size, (const grub_uint8_t **) &rest) 
+        != 0)
     {
       struct grub_term_output *term;
-      size = 0;
+      size -= rest - buf;
+      grub_memmove (buf, rest, size);
       FOR_ACTIVE_TERM_OUTPUTS(term)
        grub_putcode (code, term);
       if (code == '\n' && grub_newline_hook)