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>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
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;
}