mirror of
https://github.com/swaywm/sway.git
synced 2024-11-26 09:51:29 +00:00
Check xdg_surface's role before using its toplevel
Don't access xdg_surface->toplevel if xdg_surface->role is equal to WLR_XDG_SURFACE_ROLE_NONE, since this could lead to crash. The same checks are added for xdg_surface_v6. Fixes #3311
This commit is contained in:
parent
6b8bf10941
commit
7c27d73b02
|
@ -216,7 +216,7 @@ static bool is_transient_for(struct sway_view *child,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
struct wlr_xdg_surface *surface = child->wlr_xdg_surface;
|
struct wlr_xdg_surface *surface = child->wlr_xdg_surface;
|
||||||
while (surface) {
|
while (surface && surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) {
|
||||||
if (surface->toplevel->parent == ancestor->wlr_xdg_surface) {
|
if (surface->toplevel->parent == ancestor->wlr_xdg_surface) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -213,7 +213,7 @@ static bool is_transient_for(struct sway_view *child,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
struct wlr_xdg_surface_v6 *surface = child->wlr_xdg_surface_v6;
|
struct wlr_xdg_surface_v6 *surface = child->wlr_xdg_surface_v6;
|
||||||
while (surface) {
|
while (surface && surface->role == WLR_XDG_SURFACE_V6_ROLE_TOPLEVEL) {
|
||||||
if (surface->toplevel->parent == ancestor->wlr_xdg_surface_v6) {
|
if (surface->toplevel->parent == ancestor->wlr_xdg_surface_v6) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -341,7 +341,7 @@ static bool surface_is_popup(struct wlr_surface *surface) {
|
||||||
if (wlr_surface_is_xdg_surface(surface)) {
|
if (wlr_surface_is_xdg_surface(surface)) {
|
||||||
struct wlr_xdg_surface *xdg_surface =
|
struct wlr_xdg_surface *xdg_surface =
|
||||||
wlr_xdg_surface_from_wlr_surface(surface);
|
wlr_xdg_surface_from_wlr_surface(surface);
|
||||||
while (xdg_surface) {
|
while (xdg_surface && xdg_surface->role != WLR_XDG_SURFACE_ROLE_NONE) {
|
||||||
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -353,7 +353,8 @@ static bool surface_is_popup(struct wlr_surface *surface) {
|
||||||
if (wlr_surface_is_xdg_surface_v6(surface)) {
|
if (wlr_surface_is_xdg_surface_v6(surface)) {
|
||||||
struct wlr_xdg_surface_v6 *xdg_surface_v6 =
|
struct wlr_xdg_surface_v6 *xdg_surface_v6 =
|
||||||
wlr_xdg_surface_v6_from_wlr_surface(surface);
|
wlr_xdg_surface_v6_from_wlr_surface(surface);
|
||||||
while (xdg_surface_v6) {
|
while (xdg_surface_v6 &&
|
||||||
|
xdg_surface_v6->role != WLR_XDG_SURFACE_V6_ROLE_NONE) {
|
||||||
if (xdg_surface_v6->role == WLR_XDG_SURFACE_V6_ROLE_POPUP) {
|
if (xdg_surface_v6->role == WLR_XDG_SURFACE_V6_ROLE_POPUP) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue