Skip to content
This repository has been archived by the owner on Apr 18, 2023. It is now read-only.

Commit

Permalink
Merge pull request #4015 from orestisfl/layout-restore-crash-floating
Browse files Browse the repository at this point in the history
Fix load_layout crash when floating node doesn't have CT_FLOATING_CON parent
  • Loading branch information
Airblader committed Apr 12, 2020
2 parents 62279ab + a87e8c8 commit adbef0c
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
13 changes: 13 additions & 0 deletions src/load_layout.c
Expand Up @@ -170,6 +170,19 @@ static int json_end_map(void *ctx) {
con_attach(json_node, json_node->parent, true);
LOG("Creating window\n");
x_con_init(json_node);

/* Fix erroneous JSON input regarding floating containers to avoid
* crashing, see #3901. */
const int old_floating_mode = json_node->floating;
if (old_floating_mode >= FLOATING_AUTO_ON && json_node->parent->type != CT_FLOATING_CON) {
LOG("Fixing floating node without CT_FLOATING_CON parent\n");

/* Force floating_enable to work */
json_node->floating = FLOATING_AUTO_OFF;
floating_enable(json_node, false);
json_node->floating = old_floating_mode;
}

json_node = json_node->parent;
incomplete--;
DLOG("incomplete = %d\n", incomplete);
Expand Down
46 changes: 45 additions & 1 deletion testcases/t/215-layout-restore-crash.t
Expand Up @@ -212,7 +212,7 @@ subtest 'issue 2755' => sub {
EOT
$fh->flush;
$reply = cmd "append_layout $filename";
ok(!$reply->[0]->{success}, 'IPC reply indicated success');
ok(!$reply->[0]->{success}, 'IPC reply did not indicate success');

does_i3_live;

Expand Down Expand Up @@ -276,5 +276,49 @@ does_i3_live;

close($fh);

################################################################################
# Issue with floating key being set, without proper parent
# See #3901
################################################################################
subtest 'issue 3901' => sub {
kill_all_windows;
$ws = fresh_workspace;
is(scalar @{get_ws($ws)->{floating_nodes}}, 0, 'No floating nodes yet');

($fh, $filename) = tempfile(UNLINK => 1);
print $fh <<'EOT';
// vim:ts=4:sw=4:et
{
"border": "pixel",
"current_border_width": 1,
"floating": "auto_on", // crashes: user_on, auto_on, no crash: user_off, auto_off
"geometry": {
"height": 400,
"width": 300,
"x": 820,
"y": 350
},
"name": "Click me to crash",
"percent": 0.5, // still crashes if this field is absent
"swallows": [
{
"class": "^this doesn't matter as long as it doesn't match a new window$"
}
],
"type": "con"
}
EOT
$fh->flush;
$reply = cmd "append_layout $filename";
ok($reply->[0]->{success}, 'IPC reply indicated success');

cmd '[floating] focus';
is(scalar @{get_ws($ws)->{floating_nodes}}, 1, 'one floating node on this ws');

does_i3_live;

close($fh);
};

done_testing;

0 comments on commit adbef0c

Please sign in to comment.