compose/parser: fix segfault when including
authorRan Benita <ran234@gmail.com>
Mon, 13 Oct 2014 15:51:12 +0000 (18:51 +0300)
committerRan Benita <ran234@gmail.com>
Mon, 13 Oct 2014 15:54:52 +0000 (18:54 +0300)
The keysym cache for the new scanner was not initialized.
To avoid such errors also in the future, require passing the priv
argument in scanner_init(), instead of initializing it separately.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/compose/parser.c
src/scanner-utils.h
src/xkbcomp/rules.c
src/xkbcomp/scanner.c

index 9469aa4..51ad4ed 100644 (file)
@@ -485,7 +485,7 @@ do_include(struct xkb_compose_table *table, struct scanner *s,
         goto err_file;
     }
 
-    scanner_init(&new_s, table->ctx, string, size, path);
+    scanner_init(&new_s, table->ctx, string, size, path, s->priv);
 
     ok = parse(table, &new_s, include_depth + 1);
     if (!ok)
@@ -634,9 +634,8 @@ parse_string(struct xkb_compose_table *table, const char *string, size_t len,
 {
     struct scanner s;
     struct keysym_from_name_cache cache;
-    scanner_init(&s, table->ctx, string, len, file_name);
     memset(&cache, 0, sizeof(cache));
-    s.priv = &cache;
+    scanner_init(&s, table->ctx, string, len, file_name, &cache);
     if (!parse(table, &s, 0))
         return false;
     /* Maybe the allocator can use the excess space. */
index 914e11f..b60a100 100644 (file)
@@ -71,7 +71,8 @@ struct scanner {
 
 static inline void
 scanner_init(struct scanner *s, struct xkb_context *ctx,
-             const char *string, size_t len, const char *file_name)
+             const char *string, size_t len, const char *file_name,
+             void *priv)
 {
     s->s = string;
     s->len = len;
@@ -80,6 +81,7 @@ scanner_init(struct scanner *s, struct xkb_context *ctx,
     s->token_line = s->token_column = 1;
     s->file_name = file_name;
     s->ctx = ctx;
+    s->priv = priv;
 }
 
 static inline char
index f4b475a..94ac547 100644 (file)
@@ -828,7 +828,7 @@ matcher_match(struct matcher *m, const char *string, size_t len,
     if (!m)
         return false;
 
-    scanner_init(&m->scanner, m->ctx, string, len, file_name);
+    scanner_init(&m->scanner, m->ctx, string, len, file_name, NULL);
 
 initial:
     switch (tok = gettok(m)) {
index 8f24721..ba8f4e9 100644 (file)
@@ -182,7 +182,7 @@ XkbParseString(struct xkb_context *ctx, const char *string, size_t len,
                const char *file_name, const char *map)
 {
     struct scanner scanner;
-    scanner_init(&scanner, ctx, string, len, file_name);
+    scanner_init(&scanner, ctx, string, len, file_name, NULL);
     return parse(ctx, &scanner, map);
 }