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 <phco...@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-01-31 Vladimir Serbinenko <phco...@gmail.com> + * 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)
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel