diff options
author | Paul Riou <paul.riou@protonmail.com> | 2020-11-17 00:26:38 +0000 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2020-12-04 10:49:49 +0100 |
commit | b5cc11b2268820fd49151a5a868c5fff285a652c (patch) | |
tree | b2a2dcea5eb3b4261aefd9305182528143b441e6 /sway | |
parent | common: make 'lenient_strcmp' arguments const (diff) | |
download | sway-b5cc11b2268820fd49151a5a868c5fff285a652c.tar.gz sway-b5cc11b2268820fd49151a5a868c5fff285a652c.tar.zst sway-b5cc11b2268820fd49151a5a868c5fff285a652c.zip |
criteria: fix crash when comparing NULL properties
For each following combinations of criteria & command below, the command would
crash sway without the fix.
It's particular about the __focused__ criteria, where the view matches part of
the criteria but not the focused app, leading to a failure when calling
`strcmp` with NULL.
"xterm" is a non-wayland app (X11) and "kitty" is. Both are terminals.
# "class" is specific to X11
# The view is X11 (xterm) leading to the criteria checking for the
# focused app's class, leading to a crash
for_window [class="__focused__"] floating enable
exec kitty -e xterm
# Similarly, crash as the focused app (xterm) has no app_id when the view has one
for_window [app_id="__focused__"] floating enable
exec xterm -e kitty
# If the view has a title but not the focused app: NULL title will crash criteria checking
for_window [title="__focused__"] floating enable
exec xterm -title "" -e xterm
Diffstat (limited to 'sway')
-rw-r--r-- | sway/criteria.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/sway/criteria.c b/sway/criteria.c index 02b04fc8..409160c5 100644 --- a/sway/criteria.c +++ b/sway/criteria.c | |||
@@ -188,7 +188,7 @@ static bool criteria_matches_view(struct criteria *criteria, | |||
188 | 188 | ||
189 | switch (criteria->title->match_type) { | 189 | switch (criteria->title->match_type) { |
190 | case PATTERN_FOCUSED: | 190 | case PATTERN_FOCUSED: |
191 | if (focused && strcmp(title, view_get_title(focused))) { | 191 | if (focused && lenient_strcmp(title, view_get_title(focused))) { |
192 | return false; | 192 | return false; |
193 | } | 193 | } |
194 | break; | 194 | break; |
@@ -228,7 +228,7 @@ static bool criteria_matches_view(struct criteria *criteria, | |||
228 | 228 | ||
229 | switch (criteria->app_id->match_type) { | 229 | switch (criteria->app_id->match_type) { |
230 | case PATTERN_FOCUSED: | 230 | case PATTERN_FOCUSED: |
231 | if (focused && strcmp(app_id, view_get_app_id(focused))) { | 231 | if (focused && lenient_strcmp(app_id, view_get_app_id(focused))) { |
232 | return false; | 232 | return false; |
233 | } | 233 | } |
234 | break; | 234 | break; |
@@ -260,7 +260,7 @@ static bool criteria_matches_view(struct criteria *criteria, | |||
260 | 260 | ||
261 | switch (criteria->class->match_type) { | 261 | switch (criteria->class->match_type) { |
262 | case PATTERN_FOCUSED: | 262 | case PATTERN_FOCUSED: |
263 | if (focused && strcmp(class, view_get_class(focused))) { | 263 | if (focused && lenient_strcmp(class, view_get_class(focused))) { |
264 | return false; | 264 | return false; |
265 | } | 265 | } |
266 | break; | 266 | break; |