From f33abb817d81d2fb0f2b3a31ba690829f56dd2b8 Mon Sep 17 00:00:00 2001 From: Nicolas Dichtel Date: Mon, 2 May 2022 15:26:11 +0200 Subject: [PATCH] lib/if: fix interface name comparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 ") Signed-off-by: Nicolas Dichtel Tested-by: Aurélien Degeorges Acked-by: Philippe Guibert --- lib/if.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/if.c b/lib/if.c index 83fa85ecc1ee..354f37ca873c 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") */ }