grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Don't discard valid UTF-8 following non-valid one


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: [PATCH] Don't discard valid UTF-8 following non-valid one
Date: Sun, 31 Jan 2010 01:53:52 +0100
User-agent: Mozilla-Thunderbird 2.0.0.22 (X11/20091109)

This discarding is Unicode-uncompliant and can create problems like
accidental discarding of \0 in some cases

-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko

=== modified file 'ChangeLog'
--- ChangeLog   2010-01-31 00:26:11 +0000
+++ ChangeLog   2010-01-31 00:50:47 +0000
@@ -1,5 +1,11 @@
 2010-01-31  Vladimir Serbinenko  <address@hidden>
 
+       * kern/misc.c (grub_utf8_to_ucs4): Don't eat valid characters preceeded
+       by non-valid ones.
+       * kern/term.c (grub_putchar): Likewise.
+
+2010-01-31  Vladimir Serbinenko  <address@hidden>
+
        * font/font.c (find_glyph): Check that bmp_idx is available before
        using it.
        (grub_font_get_string_width): Never call grub_font_get_glyph_internal

=== modified file 'kern/misc.c'
--- kern/misc.c 2010-01-20 08:12:47 +0000
+++ kern/misc.c 2010-01-31 00:35:13 +0000
@@ -975,6 +975,10 @@ grub_utf8_to_ucs4 (grub_uint32_t *dest, 
            {
              /* invalid */
              code = '?';
+             /* Character c may be valid, don't eat it.  */
+             src--;
+             if (srcsize != (grub_size_t)-1)
+               srcsize++;
              count = 0;
            }
          else

=== modified file 'kern/term.c'
--- kern/term.c 2010-01-10 12:34:48 +0000
+++ kern/term.c 2010-01-31 00:49:09 +0000
@@ -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)

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]