summaryrefslogtreecommitdiff
path: root/lib/if.c
diff options
context:
space:
mode:
authorNicolas Dichtel <nicolas.dichtel@6wind.com>2022-05-02 15:26:11 +0200
committerNicolas Dichtel <nicolas.dichtel@6wind.com>2022-05-30 14:19:36 +0200
commitf33abb817d81d2fb0f2b3a31ba690829f56dd2b8 (patch)
tree440b28e4362cea4ad7536b188772913b31abffcc /lib/if.c
parent8bc5979049cd188feb927105856f91356949c5e8 (diff)
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: 106d2fd572c1 ("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>
Diffstat (limited to 'lib/if.c')
-rw-r--r--lib/if.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/lib/if.c b/lib/if.c
index 83fa85ecc1..354f37ca87 100644
--- a/lib/if.c
+++ b/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") */
}