Complain properly about unterminated comments in config files.
authorMichael Poole <mdpoole@troilus.org>
Mon, 22 Nov 2010 12:31:01 +0000 (07:31 -0500)
committerMichael Poole <mdpoole@troilus.org>
Mon, 22 Nov 2010 12:31:01 +0000 (07:31 -0500)
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

index 8f4e8c567e7c756cdbca27ed2f2125d75e8e1760..9b8ac1455e67c1df3e9bff0d6764aa4caef0c9f6 100644 (file)
@@ -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;