summaryrefslogtreecommitdiffstats
path: root/source/n/netkit-ftp/patches/33-netkit-ftp-0.17-token.patch
blob: d8883009b84da18b311c094afe26f5d72313b66b (plain) (blame)
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
diff -rup netkit-ftp-0.17/ftp/ruserpass.c netkit-ftp-0.17-new/ftp/ruserpass.c
--- netkit-ftp-0.17/ftp/ruserpass.c	2012-10-29 15:11:10.593841089 +0100
+++ netkit-ftp-0.17-new/ftp/ruserpass.c	2012-10-29 15:13:14.379822697 +0100
@@ -58,7 +58,8 @@ static int token(void);
 #define	ID	10
 #define	MACH	11
 
-static char tokval[100];
+#define MAXTOKENLEN 4096
+static char tokval[MAXTOKENLEN];
 
 static struct toktab {
 	const char *tokstr;
@@ -249,13 +250,16 @@ bad:
 	return(-1);
 }
 
-static 
+static
 int
 token(void)
 {
 	char *cp;
 	int c;
 	struct toktab *t;
+	size_t toklen = 0;
+	int showwarn = 1;
+	int quote = 0;
 
 	if (feof(cfile))
 		return (0);
@@ -266,20 +270,32 @@ token(void)
 		return (0);
 	cp = tokval;
 	if (c == '"') {
-		while ((c = getc(cfile)) != EOF && c != '"') {
-			if (c == '\\')
-				c = getc(cfile);
-			*cp++ = c;
-		}
-	} else {
+		quote = 1;
+	}
+	else {
 		*cp++ = c;
-		while ((c = getc(cfile)) != EOF
-		    && c != '\n' && c != '\t' && c != ' ' && c != ',') {
-			if (c == '\\')
-				c = getc(cfile);
-			*cp++ = c;
+		toklen++;
+	}
+	while ((c = getc(cfile)) != EOF) {
+		if (c == '"')
+			break;
+		if (c == '\\')
+			c = getc(cfile);
+		if (!quote && (c == '\n' || c == '\t' || c == ' ' || c == ','))
+			break;
+		if (toklen >= MAXTOKENLEN) {
+			if (showwarn) {
+				fprintf(stderr,
+						"Warning: .netrc token too long, will be trunctated to %zd characters\n",
+						toklen);
+				showwarn = 0;
+			}
+			continue;
 		}
+		*cp++ = c;
+		toklen++;
 	}
+
 	*cp = 0;
 	if (tokval[0] == 0)
 		return (0);