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.
enum fail_codes {
UNTERMINATED_STRING,
enum fail_codes {
UNTERMINATED_STRING,
EXPECTED_OPEN_QUOTE,
EXPECTED_OPEN_BRACE,
EXPECTED_OPEN_PAREN,
EXPECTED_OPEN_QUOTE,
EXPECTED_OPEN_BRACE,
EXPECTED_OPEN_PAREN,
do {
do {
c = dbgetc(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 = 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 */
} while (in_comment);
} else if (d == '/') {
/* C++ style comment, with slash slash comment newline */
const char *reason;
switch (code >> 8) {
case UNTERMINATED_STRING: reason = "Unterminated string"; break;
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;
case EXPECTED_OPEN_QUOTE: reason = "Expected '\"'"; break;
case EXPECTED_OPEN_BRACE: reason = "Expected '{'"; break;
case EXPECTED_OPEN_PAREN: reason = "Expected '('"; break;