From 5808de1e3e2db867ac9138a971d1d7e6b5ca5015 Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Mon, 22 Nov 2010 07:31:01 -0500 Subject: [PATCH] Complain properly about unterminated comments in config files. sylar noticed that unterminated comments would often cause an infinite loop in the config parser. src/recdb.c (fail_codes): Add UNTERMINATED_COMMENT value. (parse_skip_ws): Abort with that on EOF inside a comment. (failure_reason): Handle UNTERMINATED_COMMENT. --- src/recdb.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/recdb.c b/src/recdb.c index 8f4e8c5..9b8ac14 100644 --- a/src/recdb.c +++ b/src/recdb.c @@ -109,6 +109,7 @@ ABORT(RECDB *recdb, int code, unsigned char ch) { enum fail_codes { UNTERMINATED_STRING, + UNTERMINATED_COMMENT, EXPECTED_OPEN_QUOTE, EXPECTED_OPEN_BRACE, EXPECTED_OPEN_PAREN, @@ -345,8 +346,10 @@ parse_skip_ws(RECDB *recdb) do { do { c = dbgetc(recdb); - } while (c != '*' && c != EOF); + if (c == EOF) ABORT(recdb, UNTERMINATED_COMMENT, c); + } while (c != '*'); if ((c = dbgetc(recdb)) == '/') in_comment = 0; + if (c == EOF) ABORT(recdb, UNTERMINATED_COMMENT, c); } while (in_comment); } else if (d == '/') { /* C++ style comment, with slash slash comment newline */ @@ -552,6 +555,7 @@ failure_reason(int code) const char *reason; switch (code >> 8) { case UNTERMINATED_STRING: reason = "Unterminated string"; break; + case UNTERMINATED_COMMENT: reason = "Unterminated comment"; break; case EXPECTED_OPEN_QUOTE: reason = "Expected '\"'"; break; case EXPECTED_OPEN_BRACE: reason = "Expected '{'"; break; case EXPECTED_OPEN_PAREN: reason = "Expected '('"; break; -- 2.20.1