2018-04-13 11:01:22 +02:00
|
|
|
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(-)
|
|
|
|
|
2021-10-27 18:05:03 +02:00
|
|
|
Index: xorg-server-21.1.0/randr/randr.c
|
2019-09-18 14:48:07 +02:00
|
|
|
===================================================================
|
2021-10-27 18:05:03 +02:00
|
|
|
--- xorg-server-21.1.0.orig/randr/randr.c
|
|
|
|
+++ xorg-server-21.1.0/randr/randr.c
|
|
|
|
@@ -651,7 +651,9 @@ RRTellChanged(ScreenPtr pScreen)
|
2018-04-13 11:01:22 +02:00
|
|
|
|
2021-10-27 18:05:03 +02:00
|
|
|
xorg_list_for_each_entry(iter, &primary->secondary_list, secondary_head) {
|
|
|
|
pSecondaryScrPriv = rrGetScrPriv(iter);
|
|
|
|
- pSecondaryScrPriv->provider->changed = FALSE;
|
|
|
|
+ if (pSecondaryScrPriv->provider) {
|
|
|
|
+ pSecondaryScrPriv->provider->changed = FALSE;
|
|
|
|
+ }
|
|
|
|
if (iter->is_output_secondary) {
|
|
|
|
for (i = 0; i < pSecondaryScrPriv->numOutputs; i++)
|
|
|
|
pSecondaryScrPriv->outputs[i]->changed = FALSE;
|