Add safety check for QueryTree
xcb_qeuery_tree should fail and we should not just assume that the call succeeds. Crash reported by Harald Sitter.
This commit is contained in:
parent
e2c422dcb5
commit
7d797387d7
2 changed files with 17 additions and 15 deletions
30
layers.cpp
30
layers.cpp
|
@ -668,23 +668,25 @@ ToplevelList Workspace::xStackingOrder() const
|
|||
foreach (Toplevel * c, stacking_order)
|
||||
x_stacking.append(c);
|
||||
|
||||
xcb_window_t *windows = tree.children();
|
||||
const auto count = tree->children_len;
|
||||
int foundUnmanagedCount = unmanaged.count();
|
||||
for (unsigned int i = 0;
|
||||
i < count;
|
||||
++i) {
|
||||
for (auto it = unmanaged.constBegin(); it != unmanaged.constEnd(); ++it) {
|
||||
Unmanaged *u = *it;
|
||||
if (u->window() == windows[i]) {
|
||||
x_stacking.append(u);
|
||||
foundUnmanagedCount--;
|
||||
if (!tree.isNull()) {
|
||||
xcb_window_t *windows = tree.children();
|
||||
const auto count = tree->children_len;
|
||||
int foundUnmanagedCount = unmanaged.count();
|
||||
for (unsigned int i = 0;
|
||||
i < count;
|
||||
++i) {
|
||||
for (auto it = unmanaged.constBegin(); it != unmanaged.constEnd(); ++it) {
|
||||
Unmanaged *u = *it;
|
||||
if (u->window() == windows[i]) {
|
||||
x_stacking.append(u);
|
||||
foundUnmanagedCount--;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundUnmanagedCount == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (foundUnmanagedCount == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (m_compositor) {
|
||||
const_cast< Workspace* >(this)->m_compositor->checkUnredirect();
|
||||
|
|
|
@ -574,7 +574,7 @@ public:
|
|||
explicit Tree(WindowId window) : Wrapper<TreeData, xcb_window_t>(window) {}
|
||||
|
||||
inline WindowId *children() {
|
||||
if (data()->children_len == 0) {
|
||||
if (isNull() || data()->children_len == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
return xcb_query_tree_children(data());
|
||||
|
|
Loading…
Reference in a new issue