5f38f71
diff -rup netkit-ftp-0.17/ftp/ruserpass.c netkit-ftp-0.17-new/ftp/ruserpass.c
5f38f71
--- netkit-ftp-0.17/ftp/ruserpass.c	2012-10-29 15:11:10.593841089 +0100
5f38f71
+++ netkit-ftp-0.17-new/ftp/ruserpass.c	2012-10-29 15:13:14.379822697 +0100
5f38f71
@@ -58,7 +58,8 @@ static int token(void);
5f38f71
 #define	ID	10
5f38f71
 #define	MACH	11
5f38f71
 
5f38f71
-static char tokval[100];
5f38f71
+#define MAXTOKENLEN 4096
5f38f71
+static char tokval[MAXTOKENLEN];
5f38f71
 
5f38f71
 static struct toktab {
5f38f71
 	const char *tokstr;
5f38f71
@@ -249,13 +250,16 @@ bad:
5f38f71
 	return(-1);
5f38f71
 }
5f38f71
 
5f38f71
-static 
5f38f71
+static
5f38f71
 int
5f38f71
 token(void)
5f38f71
 {
5f38f71
 	char *cp;
5f38f71
 	int c;
5f38f71
 	struct toktab *t;
5f38f71
+	size_t toklen = 0;
5f38f71
+	int showwarn = 1;
5f38f71
+	int quote = 0;
5f38f71
 
5f38f71
 	if (feof(cfile))
5f38f71
 		return (0);
5f38f71
@@ -266,20 +270,32 @@ token(void)
5f38f71
 		return (0);
5f38f71
 	cp = tokval;
5f38f71
 	if (c == '"') {
5f38f71
-		while ((c = getc(cfile)) != EOF && c != '"') {
5f38f71
-			if (c == '\\')
5f38f71
-				c = getc(cfile);
5f38f71
-			*cp++ = c;
5f38f71
-		}
5f38f71
-	} else {
5f38f71
+		quote = 1;
5f38f71
+	}
5f38f71
+	else {
5f38f71
 		*cp++ = c;
5f38f71
-		while ((c = getc(cfile)) != EOF
5f38f71
-		    && c != '\n' && c != '\t' && c != ' ' && c != ',') {
5f38f71
-			if (c == '\\')
5f38f71
-				c = getc(cfile);
5f38f71
-			*cp++ = c;
5f38f71
+		toklen++;
5f38f71
+	}
5f38f71
+	while ((c = getc(cfile)) != EOF) {
5f38f71
+		if (c == '"')
5f38f71
+			break;
5f38f71
+		if (c == '\\')
5f38f71
+			c = getc(cfile);
5f38f71
+		if (!quote && (c == '\n' || c == '\t' || c == ' ' || c == ','))
5f38f71
+			break;
5f38f71
+		if (toklen >= MAXTOKENLEN) {
5f38f71
+			if (showwarn) {
5f38f71
+				fprintf(stderr,
5f38f71
+						"Warning: .netrc token too long, will be trunctated to %zd characters\n",
5f38f71
+						toklen);
5f38f71
+				showwarn = 0;
5f38f71
+			}
5f38f71
+			continue;
5f38f71
 		}
5f38f71
+		*cp++ = c;
5f38f71
+		toklen++;
5f38f71
 	}
5f38f71
+
5f38f71
 	*cp = 0;
5f38f71
 	if (tokval[0] == 0)
5f38f71
 		return (0);