]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/normal/charset.c (grub_utf8_to_ucs4_alloc): Avoid deadloop
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 29 Aug 2010 19:57:37 +0000 (21:57 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sun, 29 Aug 2010 19:57:37 +0000 (21:57 +0200)
on malloc error.
(grub_bidi_logical_to_visual): Check that malloc succeded.
* grub-core/normal/term.c (grub_puts_terminal): Fix fallback to dumb
puts.
(grub_xputs_normal): Likewise.

ChangeLog
grub-core/normal/charset.c
grub-core/normal/term.c

index c2ebd617360d6bdabb86a7a109e15eb4da1a613d..b3b6c342bb5e90d03bf04cdec6c2251752360d9e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2010-08-29  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/normal/charset.c (grub_utf8_to_ucs4_alloc): Avoid deadloop
+       on malloc error.
+       (grub_bidi_logical_to_visual): Check that malloc succeded.
+       * grub-core/normal/term.c (grub_puts_terminal): Fix fallback to dumb
+       puts.
+       (grub_xputs_normal): Likewise.
+
 2010-08-29  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/Makefile.core.def (kernel): Add kern/mips/cache_flush.S to
index fd377e1c6669c1a929a74bf46dcba470dee8630d..b7f775c4fd60837a741c3cbc37d430e1730d5832 100644 (file)
@@ -297,13 +297,10 @@ grub_utf8_to_ucs4_alloc (const char *msg, grub_uint32_t **unicode_msg,
 {
   grub_size_t msg_len = grub_strlen (msg);
 
-  *unicode_msg = grub_malloc (grub_strlen (msg) * sizeof (grub_uint32_t));
+  *unicode_msg = grub_malloc (msg_len * sizeof (grub_uint32_t));
  
   if (!*unicode_msg)
-    {
-      grub_printf ("utf8_to_ucs4 ERROR1: %s", msg);
-      return -1;
-    }
+    return -1;
 
   msg_len = grub_utf8_to_ucs4 (*unicode_msg, msg_len,
                              (grub_uint8_t *) msg, -1, 0);
@@ -1215,6 +1212,8 @@ grub_bidi_logical_to_visual (const grub_uint32_t *logical,
   struct grub_unicode_glyph *visual_ptr;
   *visual_out = visual_ptr = grub_malloc (2 * sizeof (visual_ptr[0])
                                          * logical_len);
+  if (!visual_ptr)
+    return -1;
   for (ptr = logical; ptr <= logical + logical_len; ptr++)
     {
       if (ptr == logical + logical_len || *ptr == '\n')
index e6ef002d00a3df182353ca394e1a78eac2f0ed15..02850ef4e6d957909e2c4f3648b73f35deb60afc 100644 (file)
@@ -206,19 +206,36 @@ void
 grub_puts_terminal (const char *str, struct grub_term_output *term)
 {
   grub_uint32_t *unicode_str, *unicode_last_position;
+  grub_error_push ();
   grub_utf8_to_ucs4_alloc (str, &unicode_str,
                           &unicode_last_position);
+  grub_error_pop ();
   if (!unicode_str)
     {
-      for (; str; str++)
+      for (; *str; str++)
        {
-         grub_uint32_t code = *str;
-         if (code > 0x7f)
-           code = '?';
+         struct grub_unicode_glyph c =
+           {
+             .variant = 0,
+             .attributes = 0,
+             .ncomb = 0,
+             .combining = 0,
+             .estimated_width = 1,
+             .base = *str
+           };
 
-         putcode_real (term, code);
-         if (code == '\n')
-           putcode_real (term, '\r');
+         FOR_ACTIVE_TERM_OUTPUTS(term)
+         {
+           (term->putchar) (term, &c);
+         }
+         if (*str == '\n')
+           {
+             c.base = '\r';
+             FOR_ACTIVE_TERM_OUTPUTS(term)
+             {
+               (term->putchar) (term, &c);
+             }
+           }
        }
       return;
     }
@@ -760,28 +777,41 @@ grub_print_ucs4 (const grub_uint32_t * str,
 void
 grub_xputs_normal (const char *str)
 {
-  grub_term_output_t term;
-  grub_uint32_t *unicode_str, *unicode_last_position;
+  grub_uint32_t *unicode_str = NULL, *unicode_last_position;
   int backlog = 0;
+  grub_term_output_t term;
+
+  grub_error_push ();
   grub_utf8_to_ucs4_alloc (str, &unicode_str,
-                          &unicode_last_position);
+                          &unicode_last_position);
+  grub_error_pop ();
 
   if (!unicode_str)
     {
-      grub_errno = GRUB_ERR_NONE;
       for (; *str; str++)
        {
-         grub_term_output_t term;
-         grub_uint32_t code = *str;
-         if (code > 0x7f)
-           code = '?';
+         struct grub_unicode_glyph c =
+           {
+             .variant = 0,
+             .attributes = 0,
+             .ncomb = 0,
+             .combining = 0,
+             .estimated_width = 1,
+             .base = *str
+           };
 
          FOR_ACTIVE_TERM_OUTPUTS(term)
          {
-           putcode_real (term, code);
-           if (code == '\n')
-             putcode_real (term, '\r');
+           (term->putchar) (term, &c);
          }
+         if (*str == '\n')
+           {
+             c.base = '\r';
+             FOR_ACTIVE_TERM_OUTPUTS(term)
+             {
+               (term->putchar) (term, &c);
+             }
+           }
        }
 
       return;