rules: be more paranoid in scanner
authorRan Benita <ran234@gmail.com>
Thu, 14 Mar 2013 10:45:34 +0000 (12:45 +0200)
committerDaniel Stone <daniel@fooishbar.org>
Mon, 18 Mar 2013 22:20:06 +0000 (22:20 +0000)
This can't happen, but better safe than sorry. The optimizations were
noticeable but negligible.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/xkbcomp/rules.c

index 348ecc9..3f71760 100644 (file)
@@ -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;
     }