Don't choke on RMLVO layout string with holes
authorRan Benita <ran234@gmail.com>
Fri, 21 Sep 2012 08:14:39 +0000 (11:14 +0300)
committerDaniel Stone <daniel@fooishbar.org>
Sun, 23 Sep 2012 23:08:53 +0000 (09:08 +1000)
This old rules parser gives the same kccgst here, so in the interest of
staying compatible we shouldn't fix it there. Similarly we shouldn't
touch ParseIncludeMap, so this is the best place to handle this.

Signed-off-by: Ran Benita <ran234@gmail.com>
src/xkbcomp/ast-build.c
test/rulescomp.c

index b7122b3..09774d7 100644 (file)
@@ -403,6 +403,19 @@ IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge)
         if (!ParseIncludeMap(&tmp, &file, &map, &nextop, &extra_data))
             goto err;
 
+        /*
+         * Given an RMLVO (here layout) like 'us,,fr', the rules parser
+         * will give out something like 'pc+us+:2+fr:3+inet(evdev)'.
+         * We should just skip the ':2' in this case and leave it to the
+         * appropriate section to deal with the empty group.
+         */
+        if (isempty(file)) {
+            free(file);
+            free(map);
+            free(extra_data);
+            continue;
+        }
+
         if (first == NULL) {
             first = incl = malloc(sizeof(*first));
         } else {
index 1c16dc8..e30f539 100644 (file)
@@ -110,6 +110,9 @@ int main(int argc, char *argv[])
     /* 20 is not a legal group; make sure this is handled gracefully. */
     assert(test_rmlvo(ctx, "evdev", "", "us:20", "", ""));
 
+    /* Don't choke on missing values in RMLVO. Should just skip them. */
+    assert(test_rmlvo(ctx, "evdev", "", "us,,ca", "", ""));
+
     assert(test_rmlvo(ctx, "", "", "", "", ""));
     assert(test_rmlvo(ctx, NULL, NULL, NULL, NULL, NULL));