From 0e1c1f61b67f0785352377075216a86e64160fe1 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Wed, 8 Feb 2012 19:53:46 +0100 Subject: [PATCH] * grub-core/kern/partition.c (grub_partition_get_name): Fix reverse iteration of partitions. --- ChangeLog | 5 +++++ grub-core/kern/partition.c | 25 ++++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index a3ad2aa00..eb0289b48 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-02-08 Vladimir Serbinenko + + * grub-core/kern/partition.c (grub_partition_get_name): Fix reverse + iteration of partitions. + 2012-02-08 Vladimir Serbinenko Improve gettext support. Stylistic fixes and error handling fixes while diff --git a/grub-core/kern/partition.c b/grub-core/kern/partition.c index a083f5cbb..4e6a98d18 100644 --- a/grub-core/kern/partition.c +++ b/grub-core/kern/partition.c @@ -224,22 +224,33 @@ char * grub_partition_get_name (const grub_partition_t partition) { char *out = 0, *ptr; - grub_size_t needlen = 0; + grub_size_t needlen; grub_partition_t part; + if (!partition) + return grub_strdup (""); for (part = partition; part; part = part->parent) /* Even on 64-bit machines this buffer is enough to hold longest number. */ - needlen += grub_strlen (part->partmap->name) + 27; - out = grub_malloc (needlen); + needlen += grub_strlen (part->partmap->name) + 1 + 27; + out = grub_malloc (needlen + 1); if (!out) return NULL; - ptr = out; + ptr = out + needlen; + *ptr = 0; for (part = partition; part; part = part->parent) { - grub_snprintf (ptr, needlen - (out - ptr), "%s%d", part->partmap->name, - part->number + 1); - ptr += grub_strlen (ptr); + char buf[27]; + grub_size_t len; + grub_snprintf (buf, sizeof (buf), "%d", part->number + 1); + len = grub_strlen (buf); + ptr -= len; + grub_memcpy (ptr, buf, len); + len = grub_strlen (part->partmap->name); + ptr -= len; + grub_memcpy (ptr, part->partmap->name, len); + *--ptr = ','; } + grub_memmove (out, ptr + 1, out + needlen - ptr); return out; }