]> git.sur5r.net Git - i3/i3/commitdiff
Reject empty swallow definitions 2105/head
authorIngo Bürk <ingo.buerk@tngtech.com>
Fri, 11 Dec 2015 08:00:20 +0000 (09:00 +0100)
committerIngo Bürk <ingo.buerk@tngtech.com>
Fri, 11 Dec 2015 19:28:13 +0000 (20:28 +0100)
Empty swallow definitions don't make sense and can lead to crashes,
for that reason we reject them.

fixes #2099

src/load_layout.c
testcases/t/216-layout-restore-split-swallows.t
testcases/t/234-layout-restore-output.t

index dc84c607f019984aaf4b453d86f87a4b9a736898..d9acd1ba0f89acbf326fbdcb2250f9e30c39eccb 100644 (file)
@@ -30,6 +30,7 @@ static bool parsing_geometry;
 static bool parsing_focus;
 static bool parsing_marks;
 struct Match *current_swallow;
+static bool swallow_is_empty;
 
 /* This list is used for reordering the focus stack after parsing the 'focus'
  * array. */
@@ -48,6 +49,7 @@ static int json_start_map(void *ctx) {
         current_swallow = smalloc(sizeof(Match));
         match_init(current_swallow);
         TAILQ_INSERT_TAIL(&(json_node->swallow_head), current_swallow, matches);
+        swallow_is_empty = true;
     } else {
         if (!parsing_rect && !parsing_deco_rect && !parsing_window_rect && !parsing_geometry) {
             if (last_key && strcasecmp(last_key, "floating_nodes") == 0) {
@@ -151,6 +153,13 @@ static int json_end_map(void *ctx) {
         json_node = json_node->parent;
     }
 
+    if (parsing_swallows && swallow_is_empty) {
+        /* We parsed an empty swallow definition. This is an invalid layout
+         * definition, hence we reject it. */
+        ELOG("Layout file is invalid: found an empty swallow definition.\n");
+        return 0;
+    }
+
     parsing_rect = false;
     parsing_deco_rect = false;
     parsing_window_rect = false;
@@ -232,12 +241,16 @@ static int json_string(void *ctx, const unsigned char *val, size_t len) {
         sasprintf(&sval, "%.*s", len, val);
         if (strcasecmp(last_key, "class") == 0) {
             current_swallow->class = regex_new(sval);
+            swallow_is_empty = false;
         } else if (strcasecmp(last_key, "instance") == 0) {
             current_swallow->instance = regex_new(sval);
+            swallow_is_empty = false;
         } else if (strcasecmp(last_key, "window_role") == 0) {
             current_swallow->window_role = regex_new(sval);
+            swallow_is_empty = false;
         } else if (strcasecmp(last_key, "title") == 0) {
             current_swallow->title = regex_new(sval);
+            swallow_is_empty = false;
         } else {
             ELOG("swallow key %s unknown\n", last_key);
         }
@@ -433,12 +446,15 @@ static int json_int(void *ctx, long long val) {
     if (parsing_swallows) {
         if (strcasecmp(last_key, "id") == 0) {
             current_swallow->id = val;
+            swallow_is_empty = false;
         }
         if (strcasecmp(last_key, "dock") == 0) {
             current_swallow->dock = val;
+            swallow_is_empty = false;
         }
         if (strcasecmp(last_key, "insert_where") == 0) {
             current_swallow->insert_where = val;
+            swallow_is_empty = false;
         }
     }
 
@@ -455,8 +471,10 @@ static int json_bool(void *ctx, int val) {
         json_node->sticky = val;
 
     if (parsing_swallows) {
-        if (strcasecmp(last_key, "restart_mode") == 0)
+        if (strcasecmp(last_key, "restart_mode") == 0) {
             current_swallow->restart_mode = val;
+            swallow_is_empty = false;
+        }
     }
 
     return 1;
index 2e2028a2866a257d4c6564a6b07ac1225e6f60ab..c064b5d1ab7fb5493f45c66116654639f22ce6f2 100644 (file)
@@ -54,9 +54,6 @@ print $fh <<'EOT';
     "floating": "auto_off",
     "layout": "splitv",
     "percent": 0.883854166666667,
-    "swallows": [
-       {}
-    ],
     "type": "con",
     "nodes": [
         {
@@ -65,9 +62,6 @@ print $fh <<'EOT';
             "floating": "auto_off",
             "layout": "splitv",
             "percent": 1,
-            "swallows": [
-               {}
-            ],
             "type": "con",
             "nodes": [
                 {
index bc90131d76c73e8023ebc9988ce61572254049c0..5a1f3763355e4c7574c87b1c203c56ca6c2245ac 100644 (file)
@@ -54,7 +54,7 @@ print $fh <<'EOT';
             "percent": 1,
             "swallows": [
                {
-               // "class": "^URxvt$",
+                  "class": "^URxvt$"
                // "instance": "^urxvt$",
                // "title": "^vals\\@w00t\\:\\ \\~$"
                }
@@ -119,7 +119,7 @@ print $fh <<'EOT';
             "percent": 1,
             "swallows": [
                {
-               // "class": "^URxvt$",
+                  "class": "^URxvt$"
                // "instance": "^urxvt$",
                // "title": "^vals\\@w00t\\:\\ \\~$"
                }
@@ -165,7 +165,7 @@ print $fh <<'EOT';
             "percent": 1,
             "swallows": [
                {
-               // "class": "^URxvt$",
+                  "class": "^URxvt$"
                // "instance": "^urxvt$",
                // "title": "^vals\\@w00t\\:\\ \\~$"
                }
@@ -213,7 +213,7 @@ print $fh <<'EOT';
             "percent": 1,
             "swallows": [
                {
-               // "class": "^URxvt$",
+                  "class": "^URxvt$"
                // "instance": "^urxvt$",
                // "title": "^vals\\@w00t\\:\\ \\~$"
                }