diff options
author | Ran Benita <ran234@gmail.com> | 2013-03-14 12:45:34 +0200 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2013-03-18 22:20:06 +0000 |
commit | 0513686b5d1ea14b3b8340371b2174ce152732c8 (patch) | |
tree | d360a18c97d6d4da3016dd1ccd4f07f56808f84a /src | |
parent | 0e200bd507eae13298604c129cc91aed2e947420 (diff) |
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 <ran234@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/xkbcomp/rules.c | 25 |
1 files 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; } |