From 0513686b5d1ea14b3b8340371b2174ce152732c8 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Thu, 14 Mar 2013 12:45:34 +0200 Subject: [PATCH] rules: be more paranoid in scanner This can't happen, but better safe than sorry. The optimizations were noticeable but negligible. Signed-off-by: Ran Benita --- src/xkbcomp/rules.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/xkbcomp/rules.c b/src/xkbcomp/rules.c index 348ecc9..3f71760 100644 --- a/src/xkbcomp/rules.c +++ b/src/xkbcomp/rules.c @@ -213,35 +213,26 @@ scanner_init(struct scanner *s, struct xkb_context *ctx, static char peek(struct scanner *s) { - return s->s[s->pos]; + return s->pos < s->len ? s->s[s->pos] : '\0'; } static bool eof(struct scanner *s) { - return s->s[s->pos] == '\0' || s->pos >= s->len; + return peek(s) == '\0'; } static bool eol(struct scanner *s) { - return s->s[s->pos] == '\n'; + return peek(s) == '\n'; } -/* - * Use the check_nl variant when the current char might be a new line; - * just an optimization. - */ static char next(struct scanner *s) { - s->column++; - return s->s[s->pos++]; -} - -static char -next_check_nl(struct scanner *s) -{ + if (eof(s)) + return '\0'; if (eol(s)) { s->line++; s->column = 1; @@ -264,6 +255,8 @@ chr(struct scanner *s, char ch) static bool str(struct scanner *s, const char *string, size_t len) { + if (s->len - s->pos < len) + return false; if (strncasecmp(s->s + s->pos, string, len) != 0) return false; s->pos += len; s->column += len; @@ -286,7 +279,7 @@ skip_more_whitespace_and_comments: /* New line. */ if (eol(s)) { - while (eol(s)) next_check_nl(s); + while (eol(s)) next(s); return TOK_END_OF_LINE; } @@ -297,7 +290,7 @@ skip_more_whitespace_and_comments: "illegal new line escape; must appear at end of line"); return TOK_ERROR; } - next_check_nl(s); + next(s); goto skip_more_whitespace_and_comments; }