]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/disk/raid.c (insert_array): Ensure uniqueness of readable
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 24 Jun 2011 16:26:20 +0000 (18:26 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 24 Jun 2011 16:26:20 +0000 (18:26 +0200)
names.

ChangeLog
grub-core/disk/raid.c

index eaee6266abab9047ded8b95e142a71a5c84ea3ab..d70c7c6c0f9e938ae80f3dd9b239be141a615ed3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-06-24  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/disk/raid.c (insert_array): Ensure uniqueness of readable
+       names.
+
 2011-06-24  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/commands/wildcard.c (match_files): Add a useful dprintf.
index c6be3efde6183a34b4c8f057a83509a561342748..7c7dbc3dc7859d9c23a0f9c4b3ffff5b5c68e846 100644 (file)
@@ -679,6 +679,49 @@ insert_array (grub_disk_t disk, struct grub_raid_array *new_array,
                      scanner_name);
 #endif
 
+      {
+       int max_used_number = 0, len, need_new_name = 0;
+       int add_us = 0;
+       len = grub_strlen (array->name);
+       if (len && grub_isdigit (array->name[len-1]))
+         add_us = 1;
+       for (p = array_list; p != NULL; p = p->next)
+         {
+           int cur_num;
+           char *num, *end;
+           if (grub_strncmp (p->name, array->name, len) != 0)
+             continue;
+           if (p->name[len] == 0)
+             {
+               need_new_name = 1;
+               continue;
+             }
+           if (add_us && p->name[len] != '_')
+             continue;
+           if (add_us)
+             num = p->name + len + 1;
+           else
+             num = p->name + len;
+           if (!grub_isdigit (num[0]))
+             continue;
+           cur_num = grub_strtoull (num, &end, 10);
+           if (end[0])
+             continue;
+           if (cur_num > max_used_number)
+             max_used_number = cur_num;
+         }
+       if (need_new_name)
+         {
+           char *tmp;
+           tmp = grub_xasprintf ("%s%s%d", array->name, add_us ? "_" : "",
+                                 max_used_number + 1);
+           if (!tmp)
+             return grub_errno;
+           grub_free (array->name);
+           array->name = tmp;
+         }
+      }
+
       /* Add our new array to the list.  */
       array->next = array_list;
       array_list = array;