diff options
| author | Nicolas Dichtel <nicolas.dichtel@6wind.com> | 2022-05-02 15:26:11 +0200 |
|---|---|---|
| committer | Nicolas Dichtel <nicolas.dichtel@6wind.com> | 2022-05-30 14:19:36 +0200 |
| commit | f33abb817d81d2fb0f2b3a31ba690829f56dd2b8 (patch) | |
| tree | 440b28e4362cea4ad7536b188772913b31abffcc /lib/if.c | |
| parent | 8bc5979049cd188feb927105856f91356949c5e8 (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.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -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") */ } |
