Skip to content

Commit

Permalink
Fix bug where long commands crash i3
Browse files Browse the repository at this point in the history
Commands with more than 10 words would result in i3 crashing. The root
cause is that the stack which holds arguments with identifiers is
only 10 big, but generate-command-parser.pl was giving every word an
identifier of "".
  • Loading branch information
ToxicGLaDOS committed Aug 24, 2021
1 parent fc65ca3 commit 01ba240
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 2 deletions.
11 changes: 9 additions & 2 deletions generate-command-parser.pl
Original file line number Diff line number Diff line change
Expand Up @@ -228,8 +228,15 @@ sub slurp {
($call_identifier) = ($next_state =~ /^call ([0-9]+)$/);
$next_state = '__CALL';
}
my $identifier = $token->{identifier};
say $tokfh qq| { "$token_name", "$identifier", $next_state, { $call_identifier } },|;
my $identifier;
# Set $identifier to NULL if there is no identifier
if ($token->{identifier} eq ""){
$identifier = "NULL"
}
else{
$identifier = qq|"$token->{identifier}"|;
}
say $tokfh qq| { "$token_name", $identifier, $next_state, { $call_identifier } },|;
}
say $tokfh '};';
}
Expand Down
46 changes: 46 additions & 0 deletions testcases/t/315-long-commands.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!perl
# vim:ts=4:sw=4:expandtab
#
# Please read the following documents before working on tests:
# • https://build.i3wm.org/docs/testsuite.html
# (or docs/testsuite)
#
# • https://build.i3wm.org/docs/lib-i3test.html
# (alternatively: perldoc ./testcases/lib/i3test.pm)
#
# • https://build.i3wm.org/docs/ipc.html
# (or docs/ipc)
#
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
# (unless you are already familiar with Perl)
#
# Test that commands with more than 10 non-identified words doesn't works
# 10 is the magic number chosen for the stack size which is why it's used here
# Ticket: #2968
# Bug still in: 4.19.2-103-gfc65ca36
use i3test;

######################################################################
# 1) run a long command
######################################################################

my $i3 = i3(get_socket_path());
my $tmp = fresh_workspace;

my $floatwin = open_floating_window;


my ($absolute_before, $top_before) = $floatwin->rect;

cmd 'move window container to window container to window container to left';

sync_with_i3;

my ($absolute, $top) = $floatwin->rect;

is($absolute->x, ($absolute_before->x - 10), 'moved 10 px to the left');
is($absolute->y, $absolute_before->y, 'y not changed');
is($absolute->width, $absolute_before->width, 'width not changed');
is($absolute->height, $absolute_before->height, 'height not changed');

done_testing;

0 comments on commit 01ba240

Please sign in to comment.