summaryrefslogtreecommitdiff
blob: fdde46e7ec8b2affbaf5b2b358648b546545d321 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
diff -Nrup net-tools-1.60.orig/lib/interface.c net-tools-1.60/lib/interface.c
--- net-tools-1.60.orig/lib/interface.c	2004-08-12 05:54:09.000000000 -0400
+++ net-tools-1.60/lib/interface.c	2004-08-12 06:03:20.000000000 -0400
@@ -203,28 +203,34 @@ out:
 
 static char *get_name(char *name, char *p)
 {
-    while (isspace(*p))
-	p++;
-    while (*p) {
-	if (isspace(*p))
-	    break;
-	if (*p == ':') {	/* could be an alias */
-	    char *dot = p, *dotname = name;
-	    *name++ = *p++;
-	    while (isdigit(*p))
-		*name++ = *p++;
-	    if (*p != ':') {	/* it wasn't, backup */
-		p = dot;
-		name = dotname;
-	    }
-	    if (*p == '\0')
-		return NULL;
-	    p++;
-	    break;
+    /* Extract <name>[:<alias>] from nul-terminated p where p matches
+       <name>[:<alias>]: after leading whitespace.
+       If match is not made, set name empty and return unchanged p */
+    int namestart=0, nameend=0, aliasend;
+    while (isspace(p[namestart]))
+	namestart++;
+    nameend=namestart;
+    while (p[nameend] && p[nameend]!=':' && !isspace(p[nameend]))
+	nameend++;
+    if (p[nameend]==':') {
+	aliasend=nameend+1;
+	while (p[aliasend] && isdigit(p[aliasend]))
+	    aliasend++;
+	if (p[aliasend]==':') {
+	    nameend=aliasend;
+	}
+	if ((nameend-namestart)<IFNAMSIZ) {
+	    memcpy(name,&p[namestart],nameend-namestart);
+	    name[nameend-namestart]='\0';
+	    p=&p[nameend];
+	} else {
+	    /* Interface name too large */
+	    name[0]='\0';
 	}
-	*name++ = *p++;
+    } else {
+      /* first ':' not found - return empty */
+      name[0]='\0';
     }
-    *name++ = '\0';
     return p;
 }