From e3a5c004d36d2773678610a8610f65045fba2664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Fri, 11 Dec 2015 09:00:20 +0100 Subject: [PATCH] Reject empty swallow definitions Empty swallow definitions don't make sense and can lead to crashes, for that reason we reject them. fixes #2099 --- src/load_layout.c | 20 ++++++++++++++++++- .../t/216-layout-restore-split-swallows.t | 6 ------ testcases/t/234-layout-restore-output.t | 8 ++++---- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/load_layout.c b/src/load_layout.c index dc84c607..d9acd1ba 100644 --- a/src/load_layout.c +++ b/src/load_layout.c @@ -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; diff --git a/testcases/t/216-layout-restore-split-swallows.t b/testcases/t/216-layout-restore-split-swallows.t index 2e2028a2..c064b5d1 100644 --- a/testcases/t/216-layout-restore-split-swallows.t +++ b/testcases/t/216-layout-restore-split-swallows.t @@ -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": [ { diff --git a/testcases/t/234-layout-restore-output.t b/testcases/t/234-layout-restore-output.t index bc90131d..5a1f3763 100644 --- a/testcases/t/234-layout-restore-output.t +++ b/testcases/t/234-layout-restore-output.t @@ -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\\:\\ \\~$" }