2 libmultipath/alias.c | 39 ++++++++++++++++++++++++++++++---------
3 1 file changed, 30 insertions(+), 9 deletions(-)
5 Index: multipath-tools-130222/libmultipath/alias.c
6 ===================================================================
7 --- multipath-tools-130222.orig/libmultipath/alias.c
8 +++ multipath-tools-130222/libmultipath/alias.c
9 @@ -46,11 +46,11 @@ format_devname(char *name, int id, int l
12 for (pos = len - 1; pos >= prefix_len; pos--) {
14 name[pos] = 'a' + id % 26;
20 memmove(name + prefix_len, name + pos, len - pos);
21 name[prefix_len + len - pos] = '\0';
22 @@ -66,13 +66,22 @@ scan_devname(char *alias, char *prefix)
23 if (!prefix || strncmp(alias, prefix, strlen(prefix)))
26 + if (strlen(alias) == strlen(prefix))
29 + if (strlen(alias) > strlen(prefix) + 7)
30 + /* id of 'aaaaaaaa' overflows int */
33 c = alias + strlen(prefix);
34 while (*c != '\0' && *c != ' ' && *c != '\t') {
35 + if (*c < 'a' || *c > 'z')
42 - if (*c < 'a' || *c > 'z')
47 @@ -84,7 +93,9 @@ lookup_binding(FILE *f, char *map_wwid,
50 unsigned int line_nr = 0;
54 + int smallest_bigger_id = INT_MAX;
58 @@ -100,8 +111,12 @@ lookup_binding(FILE *f, char *map_wwid,
59 if (!alias) /* blank line */
61 curr_id = scan_devname(alias, prefix);
66 + if (curr_id > biggest_id)
67 + biggest_id = curr_id;
68 + if (curr_id > id && curr_id < smallest_bigger_id)
69 + smallest_bigger_id = curr_id;
70 wwid = strtok(NULL, " \t");
73 @@ -116,11 +131,17 @@ lookup_binding(FILE *f, char *map_wwid,
74 if (*map_alias == NULL)
75 condlog(0, "Cannot copy alias from bindings "
76 "file : %s", strerror(errno));
81 condlog(3, "No matching wwid [%s] in bindings file.", map_wwid);
84 + condlog(0, "no more available user_friendly_names");
87 + if (id < smallest_bigger_id)
89 + return biggest_id + 1;
93 @@ -254,7 +275,7 @@ get_user_friendly_alias(char *wwid, char
97 - if (!alias && can_write && !bindings_read_only)
98 + if (!alias && can_write && !bindings_read_only && id)
99 alias = allocate_binding(fd, wwid, id, prefix);