[grub2/f18] Work around bug with using "\x20" in linux command line.

Peter Jones pjones at fedoraproject.org
Mon Oct 1 17:49:11 UTC 2012


commit c8494619a47c97fb009068e58746187e73e96e05
Author: Peter Jones <pjones at redhat.com>
Date:   Mon Oct 1 13:34:30 2012 -0400

    Work around bug with using "\x20" in linux command line.
    
      Related: rhbz#855849
    
    Signed-off-by: Peter Jones <pjones at redhat.com>

 grub-2.00-Handle-escapes-in-labels.patch |  187 ++++++++++++++++++++++++++++++
 grub2.spec                               |    8 +-
 2 files changed, 194 insertions(+), 1 deletions(-)
---
diff --git a/grub-2.00-Handle-escapes-in-labels.patch b/grub-2.00-Handle-escapes-in-labels.patch
new file mode 100644
index 0000000..0b5f87e
--- /dev/null
+++ b/grub-2.00-Handle-escapes-in-labels.patch
@@ -0,0 +1,187 @@
+From d08e2511db353b2db9c5785d3f22079674abd708 Mon Sep 17 00:00:00 2001
+From: Peter Jones <pjones at redhat.com>
+Date: Mon, 1 Oct 2012 13:24:37 -0400
+Subject: [PATCH] Pass "\x[[:hex:]][[:hex:]]" straight through unmolested.
+
+---
+ grub-core/commands/wildcard.c | 16 +++++++++++++++-
+ grub-core/lib/cmdline.c       | 34 +++++++++++++++++++++++++++++++--
+ grub-core/script/execute.c    | 44 +++++++++++++++++++++++++++++++++++++------
+ 3 files changed, 85 insertions(+), 9 deletions(-)
+
+diff --git a/grub-core/commands/wildcard.c b/grub-core/commands/wildcard.c
+index 2b73d9a..d1235dc 100644
+--- a/grub-core/commands/wildcard.c
++++ b/grub-core/commands/wildcard.c
+@@ -420,6 +420,12 @@ check_file (const char *dir, const char *basename)
+   return found;
+ }
+ 
++static int
++is_hex(char c)
++{
++  return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
++}
++
+ static void
+ unescape (char *out, const char *in, const char *end)
+ {
+@@ -428,7 +434,15 @@ unescape (char *out, const char *in, const char *end)
+ 
+   for (optr = out, iptr = in; iptr < end;)
+     {
+-      if (*iptr == '\\' && iptr + 1 < end)
++      if (*iptr == '\\' && iptr + 3 < end && iptr[1] == 'x' && is_hex(iptr[2]) && is_hex(iptr[3]))
++	{
++	  *optr++ = *iptr++;
++	  *optr++ = *iptr++;
++	  *optr++ = *iptr++;
++	  *optr++ = *iptr++;
++	  continue;
++	}
++      else if (*iptr == '\\' && iptr + 1 < end)
+ 	{
+ 	  *optr++ = iptr[1];
+ 	  iptr += 2;
+diff --git a/grub-core/lib/cmdline.c b/grub-core/lib/cmdline.c
+index a702e64..c8605a7 100644
+--- a/grub-core/lib/cmdline.c
++++ b/grub-core/lib/cmdline.c
+@@ -20,6 +20,12 @@
+ #include <grub/lib/cmdline.h>
+ #include <grub/misc.h>
+ 
++static int
++is_hex(char c)
++{
++  return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
++}
++
+ static unsigned int check_arg (char *c, int *has_space)
+ {
+   int space = 0;
+@@ -27,7 +33,13 @@ static unsigned int check_arg (char *c, int *has_space)
+ 
+   while (*c)
+     {
+-      if (*c == '\\' || *c == '\'' || *c == '"')
++      if (*c == '\\' && *(c+1) == 'x' && is_hex(*(c+2)) && is_hex(*(c+3)))
++	{
++	  size += 4;
++	  c += 4;
++	  continue;
++	}
++      else if (*c == '\\' || *c == '\'' || *c == '"')
+ 	size++;
+       else if (*c == ' ')
+ 	space = 1;
+@@ -82,7 +94,25 @@ int grub_create_loader_cmdline (int argc, char *argv[], char *buf,
+ 
+       while (*c)
+ 	{
+-	  if (*c == '\\' || *c == '\'' || *c == '"')
++	  if (*c == ' ')
++	    {
++	      *buf++ = '\\';
++	      *buf++ = 'x';
++	      *buf++ = '2';
++	      *buf++ = '0';
++	      c++;
++	      continue;
++	    }
++	  else if (*c == '\\' && *(c+1) == 'x' &&
++		   is_hex(*(c+2)) && is_hex(*(c+3)))
++	    {
++	      *buf++ = *c++;
++	      *buf++ = *c++;
++	      *buf++ = *c++;
++	      *buf++ = *c++;
++	      continue;
++	    }
++	  else if (*c == '\\' || *c == '\'' || *c == '"')
+ 	    *buf++ = '\\';
+ 
+ 	  *buf++ = *c;
+diff --git a/grub-core/script/execute.c b/grub-core/script/execute.c
+index b5e6eb0..c44eced 100644
+--- a/grub-core/script/execute.c
++++ b/grub-core/script/execute.c
+@@ -52,6 +52,12 @@ static struct grub_script_scope *scope = 0;
+ /* Wildcard translator for GRUB script.  */
+ struct grub_script_wildcard_translator *grub_wildcard_translator;
+ 
++static int
++is_hex(char c)
++{
++  return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
++}
++
+ static char*
+ wildcard_escape (const char *s)
+ {
+@@ -68,7 +74,15 @@ wildcard_escape (const char *s)
+   i = 0;
+   while ((ch = *s++))
+     {
+-      if (ch == '*' || ch == '\\' || ch == '?')
++      if (ch == '\\' && s[0] == 'x' && is_hex(s[1]) && is_hex(s[2]))
++	{
++	  p[i++] = ch;
++	  p[i++] = *s++;
++	  p[i++] = *s++;
++	  p[i++] = *s++;
++	  continue;
++	}
++      else if (ch == '*' || ch == '\\' || ch == '?')
+ 	p[i++] = '\\';
+       p[i++] = ch;
+     }
+@@ -92,7 +106,14 @@ wildcard_unescape (const char *s)
+   i = 0;
+   while ((ch = *s++))
+     {
+-      if (ch == '\\')
++      if (ch == '\\' && s[0] == 'x' && is_hex(s[1]) && is_hex(s[2]))
++	{
++	  p[i++] = '\\';
++	  p[i++] = *s++;
++	  p[i++] = *s++;
++	  p[i++] = *s++;
++	}
++      else if (ch == '\\')
+ 	p[i++] = *s++;
+       else
+ 	p[i++] = ch;
+@@ -381,14 +402,25 @@ parse_string (const char *str,
+   int escaped = 0;
+   const char *optr;
+ 
++  grub_printf("str: \"%s\"\n", str);
+   for (ptr = str; ptr && *ptr; )
+     switch (*ptr)
+       {
+       case '\\':
+-	escaped = !escaped;
+-	if (!escaped && put)
+-	  *((*put)++) = '\\';
+-	ptr++;
++	if (!escaped && put && *(ptr+1) == 'x' && is_hex(*(ptr+2)) && is_hex(*(ptr+3)))
++	  {
++	    *((*put)++) = *ptr++;
++	    *((*put)++) = *ptr++;
++	    *((*put)++) = *ptr++;
++	    *((*put)++) = *ptr++;
++	  }
++	else
++	  {
++	    escaped = !escaped;
++	    if (!escaped && put)
++	      *((*put)++) = '\\';
++	    ptr++;
++	  }
+ 	break;
+       case '$':
+ 	if (escaped)
+-- 
+1.7.12.1
+
diff --git a/grub2.spec b/grub2.spec
index 9e3421b..ce7f515 100644
--- a/grub2.spec
+++ b/grub2.spec
@@ -41,7 +41,7 @@
 Name:           grub2
 Epoch:          1
 Version:        2.00
-Release:        8%{?dist}
+Release:        9%{?dist}
 Summary:        Bootloader with support for Linux, Multiboot and more
 
 Group:          System Environment/Base
@@ -67,6 +67,7 @@ Patch23:	grub-2.00-dont-decrease-mmap-size.patch
 Patch24:	grub-2.00-no-insmod-on-sb.patch
 Patch25:	grub-2.00-efidisk-ahci-workaround.patch
 Patch26:	grub-2.00-increase-the-ieee1275-device-path-buffer-size.patch
+Patch27:	grub-2.00-Handle-escapes-in-labels.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -234,6 +235,7 @@ rm -fr $RPM_BUILD_ROOT
 %ifarch %{efiarchs}
 cd grub-efi-%{tarversion}
 make DESTDIR=$RPM_BUILD_ROOT install
+find $RPM_BUILD_ROOT -iname "*.module" -exec chmod a-x {} \;
 
 # Ghost config file
 install -m 755 -d $RPM_BUILD_ROOT/boot/efi/EFI/%{efidir}/
@@ -419,6 +421,10 @@ fi
 %doc grub-%{tarversion}/themes/starfield/COPYING.CC-BY-SA-3.0
 
 %changelog
+* Mon Oct 01 2012 Peter Jones <pjones at redhat.com> - 1:2.00-9
+- Work around bug with using "\x20" in linux command line.
+  Related: rhbz#855849
+
 * Thu Sep 20 2012 Peter Jones <pjones at redhat.com> - 2.00-8
 - Don't error on insmod on UEFI/SB, but also don't do any insmodding.
 - Increase device path size for ieee1275


More information about the scm-commits mailing list