]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/commands/echo.c (grub_cmd_echo): Make UTF-8-clean by
authorColin Watson <cjwatson@ubuntu.com>
Tue, 21 Dec 2010 13:52:07 +0000 (13:52 +0000)
committerColin Watson <cjwatson@ubuntu.com>
Tue, 21 Dec 2010 13:52:07 +0000 (13:52 +0000)
constructing a new unescaped string and passing it to grub_xputs in
one go, rather than passing characters to grub_printf one at a time.

ChangeLog
grub-core/commands/echo.c

index 42e059d46ae5989576fd7803dd93b2c350fdf7ad..e65dc231ce8f907986509b5e0cd2a1cebbcd9b3f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-21  Colin Watson  <cjwatson@ubuntu.com>
+
+       * grub-core/commands/echo.c (grub_cmd_echo): Make UTF-8-clean by
+       constructing a new unescaped string and passing it to grub_xputs in
+       one go, rather than passing characters to grub_printf one at a time.
+
 2010-12-21  Colin Watson  <cjwatson@ubuntu.com>
 
        * grub-core/fs/udf.c (read_string): Pacify GCC warning by
index 7ab9f92c6fd97f0f48380981d69e974857d35ad5..93a452fc8eb776e15bc2459bd3d1f2546f3d800d 100644 (file)
@@ -44,8 +44,14 @@ grub_cmd_echo (grub_extcmd_context_t ctxt, int argc, char **args)
   for (i = 0; i < argc; i++)
     {
       char *arg = *args;
+      /* Unescaping results in a string no longer than the original.  */
+      char *unescaped = grub_malloc (grub_strlen (arg) + 1);
+      char *p = unescaped;
       args++;
 
+      if (!unescaped)
+       return grub_errno;
+
       while (*arg)
        {
          /* In case `-e' is used, parse backslashes.  */
@@ -58,11 +64,11 @@ grub_cmd_echo (grub_extcmd_context_t ctxt, int argc, char **args)
              switch (*arg)
                {
                case '\\':
-                 grub_printf ("\\");
+                 *p++ = '\\';
                  break;
 
                case 'a':
-                 grub_printf ("\a");
+                 *p++ = '\a';
                  break;
 
                case 'c':
@@ -70,23 +76,23 @@ grub_cmd_echo (grub_extcmd_context_t ctxt, int argc, char **args)
                  break;
 
                case 'f':
-                 grub_printf ("\f");
+                 *p++ = '\f';
                  break;
 
                case 'n':
-                 grub_printf ("\n");
+                 *p++ = '\n';
                  break;
 
                case 'r':
-                 grub_printf ("\r");
+                 *p++ = '\r';
                  break;
 
                case 't':
-                 grub_printf ("\t");
+                 *p++ = '\t';
                  break;
 
                case 'v':
-                 grub_printf ("\v");
+                 *p++ = '\v';
                  break;
                }
              arg++;
@@ -95,10 +101,14 @@ grub_cmd_echo (grub_extcmd_context_t ctxt, int argc, char **args)
 
          /* This was not an escaped character, or escaping is not
             enabled.  */
-         grub_printf ("%c", *arg);
+         *p++ = *arg;
          arg++;
        }
 
+      *p = '\0';
+      grub_xputs (unescaped);
+      grub_free (unescaped);
+
       /* If another argument follows, insert a space.  */
       if (i != argc - 1)
        grub_printf (" " );