summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-10-10 16:22:45 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2013-10-10 16:27:22 +0100
commitf0bd716425d1514b62565f9a65397cd1cb2ffb3a (patch)
treeb519ccb62bb77f121b64f7efcd37a6915142b359
parent700a845cc611f3e499cf0ff01bd99d472d6fd7ac (diff)
sna: Sanitize output->crtc before falling back oto xf86InitialConfiguration
During initialisation, we stash the currently attached CRTC id in output->crtc. This is fine as ordinarily we would not dereference output->crtc until after it had been assigned a real CRTC. However, commit 6fda305e2f2f991b39d09e67d0b17c8c3d50f9a4 Author: Chris Wilson <chris@chris-wilson.co.uk> Date: Wed Oct 9 15:59:42 2013 +0100 sna: Append the current mode to the output list if not found introduces such an early dereference and causes a crash if we fail to probe the KMS configuration (usually due to a user override). Reported-by: Łukasz Maśko <ed@yen.ipipan.waw.pl> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_display.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c
index 71c4c605..27a44672 100644
--- a/src/sna/sna_display.c
+++ b/src/sna/sna_display.c
@@ -3225,8 +3225,10 @@ static bool sna_probe_initial_configuration(struct sna *sna)
xf86OutputPtr output = config->output[i];
uint32_t crtc_id;
- if (to_sna_output(output) == NULL)
+ if (to_sna_output(output) == NULL) {
+ assert(output->crtc == NULL);
continue;
+ }
crtc_id = (uintptr_t)output->crtc;
output->crtc = NULL;
@@ -3321,6 +3323,16 @@ static bool sna_probe_initial_configuration(struct sna *sna)
}
static void
+sanitize_outputs(struct sna *sna)
+{
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn);
+ int i;
+
+ for (i = 0; i < config->num_output; i++)
+ config->output[i]->crtc = NULL;
+}
+
+static void
sna_crtc_config_notify(ScreenPtr screen)
{
DBG(("%s\n", __FUNCTION__));
@@ -3372,8 +3384,10 @@ bool sna_mode_pre_init(ScrnInfoPtr scrn, struct sna *sna)
if (!sna_mode_fake_init(sna, num_fake))
return false;
- if (!sna_probe_initial_configuration(sna))
+ if (!sna_probe_initial_configuration(sna)) {
+ sanitize_outputs(sna);
xf86InitialConfiguration(scrn, TRUE);
+ }
sna_setup_provider(scrn);
return scrn->modes != NULL;