forked from pool/xorg-x11-server
Stefan Dirsch
c2276ffaed
- Add U_xwayland-Separate-DamagePtr-into-separate-window-data.patch and U_xwayland-Allow-passing-a-fd.patch: Needed for gnome 3.34 new and experimental xwayland on demand feature. - Rebase patches with quilt. OBS-URL: https://build.opensuse.org/request/show/731423 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=744
39 lines
1.7 KiB
Diff
39 lines
1.7 KiB
Diff
Patch-mainline: To be upstreamed
|
|
Author: Michal Srb <msrb@suse.com>
|
|
Subject: randr: Do not crash if slave screen does not have provider.
|
|
References: bnc#1068961
|
|
|
|
All GPU screens are attached as unbound GPUs to master, even if they have no
|
|
capabilities or the provider field is null. Handle that case in RRTellChanged.
|
|
---
|
|
This prevents crash in setups with for example two qxl devices, or fbdev and
|
|
qxl device. I am not sure if it is a proper fix and not just papering over a
|
|
bug somewhere else, but there are more places that test whether the provider
|
|
is set, so maybe it is correct way.
|
|
|
|
I would think that if a slave screen does not have provider, there is no reason
|
|
for it to become an unbound GPU in master's slave_list. Similarly if master has
|
|
no provider, then having anything in slave_list is useless. But it seems the
|
|
AttachUnboundGPU and the rest of the code handling screen to GPU screen
|
|
attachments does not know about randr's privates, so it can not check whether
|
|
provider is there.
|
|
|
|
randr/randr.c | 4 +++-
|
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
|
|
Index: xorg-server-1.20.5/randr/randr.c
|
|
===================================================================
|
|
--- xorg-server-1.20.5.orig/randr/randr.c
|
|
+++ xorg-server-1.20.5/randr/randr.c
|
|
@@ -647,7 +647,9 @@ RRTellChanged(ScreenPtr pScreen)
|
|
|
|
xorg_list_for_each_entry(iter, &master->slave_list, slave_head) {
|
|
pSlaveScrPriv = rrGetScrPriv(iter);
|
|
- pSlaveScrPriv->provider->changed = FALSE;
|
|
+ if (pSlaveScrPriv->provider) {
|
|
+ pSlaveScrPriv->provider->changed = FALSE;
|
|
+ }
|
|
if (iter->is_output_slave) {
|
|
for (i = 0; i < pSlaveScrPriv->numOutputs; i++)
|
|
pSlaveScrPriv->outputs[i]->changed = FALSE;
|