sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit b5cc11b2268820fd49151a5a868c5fff285a652c
parent 4583feee5969a11383a24187cff2a47abb02fa47
Author: Paul Riou <paul.riou@protonmail.com>
Date:   Tue, 17 Nov 2020 00:26:38 +0000

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:
Msway/criteria.c | 6+++---
1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/sway/criteria.c b/sway/criteria.c @@ -188,7 +188,7 @@ static bool criteria_matches_view(struct criteria *criteria, switch (criteria->title->match_type) { case PATTERN_FOCUSED: - if (focused && strcmp(title, view_get_title(focused))) { + if (focused && lenient_strcmp(title, view_get_title(focused))) { return false; } break; @@ -228,7 +228,7 @@ static bool criteria_matches_view(struct criteria *criteria, switch (criteria->app_id->match_type) { case PATTERN_FOCUSED: - if (focused && strcmp(app_id, view_get_app_id(focused))) { + if (focused && lenient_strcmp(app_id, view_get_app_id(focused))) { return false; } break; @@ -260,7 +260,7 @@ static bool criteria_matches_view(struct criteria *criteria, switch (criteria->class->match_type) { case PATTERN_FOCUSED: - if (focused && strcmp(class, view_get_class(focused))) { + if (focused && lenient_strcmp(class, view_get_class(focused))) { return false; } break;