mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-06 02:16:53 +00:00
lib/if: fix interface name comparison
Using strtol() to compare two strings is a bad idea.
Before the patch, if_cmp_name_func() may confuse foo001 and foo1.
PR=79407
Fixes: 106d2fd572
("2003-08-01 Cougar <cougar@random.ee>")
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Tested-by: Aurélien Degeorges <aurelien.degeorges@6wind.com>
Acked-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
parent
8bc5979049
commit
f33abb817d
16
lib/if.c
16
lib/if.c
@ -82,6 +82,8 @@ int if_cmp_name_func(const char *p1, const char *p2)
|
||||
int res;
|
||||
|
||||
while (*p1 && *p2) {
|
||||
char *tmp1, *tmp2;
|
||||
|
||||
/* look up to any number */
|
||||
l1 = strcspn(p1, "0123456789");
|
||||
l2 = strcspn(p2, "0123456789");
|
||||
@ -111,8 +113,8 @@ int if_cmp_name_func(const char *p1, const char *p2)
|
||||
if (!*p2)
|
||||
return 1;
|
||||
|
||||
x1 = strtol(p1, (char **)&p1, 10);
|
||||
x2 = strtol(p2, (char **)&p2, 10);
|
||||
x1 = strtol(p1, (char **)&tmp1, 10);
|
||||
x2 = strtol(p2, (char **)&tmp2, 10);
|
||||
|
||||
/* let's compare numbers now */
|
||||
if (x1 < x2)
|
||||
@ -120,6 +122,16 @@ int if_cmp_name_func(const char *p1, const char *p2)
|
||||
if (x1 > x2)
|
||||
return 1;
|
||||
|
||||
/* Compare string if numbers are equal (distinguish foo-1 from foo-001) */
|
||||
l1 = strspn(p1, "0123456789");
|
||||
l2 = strspn(p2, "0123456789");
|
||||
if (l1 != l2)
|
||||
return (strcmp(p1, p2));
|
||||
|
||||
/* Continue to parse the rest of the string */
|
||||
p1 = (const char *)tmp1;
|
||||
p2 = (const char *)tmp2;
|
||||
|
||||
/* numbers were equal, lets do it again..
|
||||
(it happens with name like "eth123.456:789") */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user