shithub: scc

Download patch

ref: 8be6d800e600783495e7c5783c128ae81e02b5b9
parent: 3e242e211f63abae5f4df5d3c41fb40452b6a500
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Apr 21 16:16:53 EDT 2015

Avoid calls to next() in error recovery code

next can raise new errors, so it is not a good idea
call it in a recovery error code, because it can
create an infinite loop.

--- a/cc1/error.c
+++ b/cc1/error.c
@@ -48,23 +48,26 @@
 void
 error(char *fmt, ...)
 {
+	int c;
 	va_list va;
+
 	va_start(va, fmt);
 	warn_helper(-1, fmt, va);
 	va_end(va);
 	failure = 1;
 
-	for (;; next()) {
+	c = yytoken;
+	do {
 		switch (safe) {
 		case END_DECL:
-			if (yytoken == ';')
+			if (c == ';')
 				goto jump;
 			break;
 		}
-	}
+	} while ((c = getchar()) != EOF);
 
 jump:
-	next();
+	yytoken = c;
 	longjmp(recover, 1);
 }