From 741d77171bd6ea971a98bdd6c78acb8f153ee896 Mon Sep 17 00:00:00 2001 From: Fedora Ninjas Date: Wed, 23 Jul 2012 19:33:50 -0300 Subject: [PATCH] Handle deives with comma in the name --- grub-core/disk/ieee1275/ofdisk.c | 15 +++++++++++---- grub-core/kern/ieee1275/openfw.c | 27 ++++++++++++++++++++++++--- grub-core/kern/main.c | 14 ++++++++++++-- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c index b5bb713..3280ead 100644 --- a/grub-core/disk/ieee1275/ofdisk.c +++ b/grub-core/disk/ieee1275/ofdisk.c @@ -265,10 +265,17 @@ grub_ofdisk_iterate (int (*hook) (const char *name), continue; { - char buffer[sizeof ("ieee1275/") + grub_strlen (ent->shortest)]; - char *ptr; - ptr = grub_stpcpy (buffer, "ieee1275/"); - grub_strcpy (ptr, ent->shortest); + char buffer[sizeof ("ieee1275/") + 2 * grub_strlen (ent->shortest)]; + const char *iptr; + char *optr; + optr = grub_stpcpy (buffer, "ieee1275/"); + for (iptr = ent->shortest; *iptr; ) + { + if (*iptr == ',') + *optr++ = '\\'; + *optr++ = *iptr++; + } + *optr = 0; if (hook (buffer)) return 1; } diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c index caf820d..a23bb60 100644 --- a/grub-core/kern/ieee1275/openfw.c +++ b/grub-core/kern/ieee1275/openfw.c @@ -439,21 +439,42 @@ char * grub_ieee1275_encode_devname (const char *path) { char *device = grub_ieee1275_get_devname (path); - char *partition = grub_ieee1275_parse_args (path, GRUB_PARSE_PARTITION); + char *partition; char *encoding; + char *optr; + const char *iptr; + encoding = grub_malloc (sizeof ("ieee1275/") + 2 * grub_strlen (device) + + sizeof (",XXXXXXXXXXXX")); + if (!encoding) + { + grub_free (device); + return 0; + } + + partition = grub_ieee1275_parse_args (path, GRUB_PARSE_PARTITION); + + optr = grub_stpcpy (encoding, "ieee1275/"); + for (iptr = device; *iptr; ) + { + if (*iptr == ',') + *optr++ ='\\'; + *optr++ = *iptr++; + } if (partition && partition[0]) { unsigned int partno = grub_strtoul (partition, 0, 0); + *optr++ = ','; + if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS)) /* GRUB partition 1 is OF partition 0. */ partno++; - encoding = grub_xasprintf ("ieee1275/%s,%d", device, partno); + grub_snprintf (optr, sizeof ("XXXXXXXXXXXX"), "%d", partno); } else - encoding = grub_xasprintf ("ieee1275/%s", device); + *optr = '\0'; grub_free (partition); grub_free (device); diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c index 7a386d0..c05ac11 100644 --- a/grub-core/kern/main.c +++ b/grub-core/kern/main.c @@ -153,8 +153,18 @@ grub_set_prefix_and_root (void) /* We have a partition, but still need to fill in the drive. */ char *comma, *new_device; - comma = grub_strchr (fwdevice, ','); - if (comma) + for (comma = fwdevice; *comma; ) + { + if (comma[0] == '\\' && comma[1] == ',') + { + comma += 2; + continue; + } + if (*comma == ',') + break; + comma++; + } + if (*comma) { char *drive = grub_strndup (fwdevice, comma - fwdevice); new_device = grub_xasprintf ("%s%s", drive, device); -- 1.7.10.4