Fix load_layout crash when floating node doesn't have CT_FLOATING_CON parent
Fixes #3901
This commit is contained in:
parent
62279aba45
commit
a87e8c8d5b
|
@ -170,6 +170,19 @@ static int json_end_map(void *ctx) {
|
||||||
con_attach(json_node, json_node->parent, true);
|
con_attach(json_node, json_node->parent, true);
|
||||||
LOG("Creating window\n");
|
LOG("Creating window\n");
|
||||||
x_con_init(json_node);
|
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;
|
json_node = json_node->parent;
|
||||||
incomplete--;
|
incomplete--;
|
||||||
DLOG("incomplete = %d\n", incomplete);
|
DLOG("incomplete = %d\n", incomplete);
|
||||||
|
|
|
@ -212,7 +212,7 @@ subtest 'issue 2755' => sub {
|
||||||
EOT
|
EOT
|
||||||
$fh->flush;
|
$fh->flush;
|
||||||
$reply = cmd "append_layout $filename";
|
$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;
|
does_i3_live;
|
||||||
|
|
||||||
|
@ -276,5 +276,49 @@ does_i3_live;
|
||||||
|
|
||||||
close($fh);
|
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;
|
done_testing;
|
||||||
|
|
Loading…
Reference in New Issue