summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ChangeLog1
-rw-r--r--src/miscbltin.c22
2 files changed, 15 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index a51975c..1dfe241 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2010-09-08  Herbert Xu <herbert@gondor.apana.org.au>
 
 	* Fix ifsfirst/ifslastp leak.
+	* Fix trailing field bug in read(1).
 
 2010-09-08  maximilian attems <max@stro.at>
 
diff --git a/src/miscbltin.c b/src/miscbltin.c
index c42a01c..653c92f 100644
--- a/src/miscbltin.c
+++ b/src/miscbltin.c
@@ -91,9 +91,20 @@ readcmd_handle_line(char *line, char **ap, size_t len)
 	*arglist.lastp = NULL;
 	ifsfree();
 
-	for (sl = arglist.list; sl; sl = sl->next) {
+	sl = arglist.list;
+
+	do {
+		if (!sl) {
+			/* nullify remaining arguments */
+			do {
+				setvar(*ap, nullstr, 0);
+			} while (*++ap);
+
+			return;
+		}
+
 		/* remaining fields present, but no variables left. */
-		if (!ap[1]) {
+		if (!ap[1] && sl->next) {
 			size_t offset;
 			char *remainder;
 
@@ -110,12 +121,7 @@ readcmd_handle_line(char *line, char **ap, size_t len)
 		/* set variable to field */
 		rmescapes(sl->text);
 		setvar(*ap, sl->text, 0);
-		ap++;
-	}
-
-	/* nullify remaining arguments */
-	do {
-		setvar(*ap, nullstr, 0);
+		sl = sl->next;
 	} while (*++ap);
 }