]> git.ipfire.org Git - ipfire-3.x.git/blob - multipath-tools/patches/0040-RH-bindings-fix.patch
krb5: Update to 1.14.4
[ipfire-3.x.git] / multipath-tools / patches / 0040-RH-bindings-fix.patch
1 ---
2 libmultipath/alias.c | 39 ++++++++++++++++++++++++++++++---------
3 1 file changed, 30 insertions(+), 9 deletions(-)
4
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
10 memset(name,0, len);
11 strcpy(name, prefix);
12 for (pos = len - 1; pos >= prefix_len; pos--) {
13 + id--;
14 name[pos] = 'a' + id % 26;
15 if (id < 26)
16 break;
17 id /= 26;
18 - id--;
19 }
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)))
24 return -1;
25
26 + if (strlen(alias) == strlen(prefix))
27 + return -1;
28 +
29 + if (strlen(alias) > strlen(prefix) + 7)
30 + /* id of 'aaaaaaaa' overflows int */
31 + return -1;
32 +
33 c = alias + strlen(prefix);
34 while (*c != '\0' && *c != ' ' && *c != '\t') {
35 + if (*c < 'a' || *c > 'z')
36 + return -1;
37 i = *c - 'a';
38 n = ( n * 26 ) + i;
39 + if (n < 0)
40 + return -1;
41 c++;
42 - if (*c < 'a' || *c > 'z')
43 - break;
44 n++;
45 }
46
47 @@ -84,7 +93,9 @@ lookup_binding(FILE *f, char *map_wwid,
48 {
49 char buf[LINE_MAX];
50 unsigned int line_nr = 0;
51 - int id = 0;
52 + int id = 1;
53 + int biggest_id = 1;
54 + int smallest_bigger_id = INT_MAX;
55
56 *map_alias = NULL;
57
58 @@ -100,8 +111,12 @@ lookup_binding(FILE *f, char *map_wwid,
59 if (!alias) /* blank line */
60 continue;
61 curr_id = scan_devname(alias, prefix);
62 - if (curr_id >= id)
63 - id = curr_id + 1;
64 + if (curr_id == id)
65 + id++;
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");
71 if (!wwid){
72 condlog(3,
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));
77 - return id;
78 + return 0;
79 }
80 }
81 condlog(3, "No matching wwid [%s] in bindings file.", map_wwid);
82 - return id;
83 + if (id < 0) {
84 + condlog(0, "no more available user_friendly_names");
85 + return 0;
86 + }
87 + if (id < smallest_bigger_id)
88 + return id;
89 + return biggest_id + 1;
90 }
91
92 static int
93 @@ -254,7 +275,7 @@ get_user_friendly_alias(char *wwid, char
94 return NULL;
95 }
96
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);
100
101 fclose(f);