Fix for a bug identied by Harald Kuthe, when using many interfaces (29
authorGlenn L McGrath <bug1@ihug.co.nz>
Fri, 23 Jul 2004 01:49:46 +0000 (01:49 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Fri, 23 Jul 2004 01:49:46 +0000 (01:49 -0000)
in this case) the order was incorrect and there were duplicate entries.

libbb/interface.c

index 2589eec49f85f142abd5579644321fc3ad59a4bb..f3655b0e08f1e1daa91dc176fb10c31d067fd994 100644 (file)
@@ -15,7 +15,7 @@
  *              that either displays or sets the characteristics of
  *              one or more of the system's networking interfaces.
  *
- * Version:     $Id: interface.c,v 1.22 2004/04/14 17:57:11 andersen Exp $
+ * Version:     $Id: interface.c,v 1.23 2004/07/23 01:49:46 bug1 Exp $
  *
  * Author:      Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
  *              and others.  Copyright 1993 MicroWalt Corporation
@@ -889,30 +889,25 @@ static int sockets_open(int family)
 }
 
 /* like strcmp(), but knows about numbers */
-static int nstrcmp(const char *astr, const char *b)
+static int nstrcmp(const char *a, const char *b)
 {
-       const char *a = astr;
+       const char *a_ptr = a;
+       const char *b_ptr = b;
 
        while (*a == *b) {
-               if (*a == '\0')
+               if (*a == '\0') {
                        return 0;
+               }
+               if (!isdigit(*a) && isdigit(*(a+1))) {
+                       a_ptr = a+1;
+                       b_ptr = b+1;
+               }
                a++;
                b++;
        }
-       if (isdigit(*a)) {
-               if (!isdigit(*b))
-                       return -1;
-               while (a > astr) {
-                       a--;
-                       if (!isdigit(*a)) {
-                               a++;
-                               break;
-                       }
-                       if (!isdigit(*b))
-                               return -1;
-                       b--;
-               }
-               return atoi(a) > atoi(b) ? 1 : -1;
+
+       if (isdigit(*a) && isdigit(*b)) {
+               return atoi(a_ptr) > atoi(b_ptr) ? 1 : -1;
        }
        return *a - *b;
 }