Use scrn->virtualX/virtualY in xf86CrtcFitsScreen. Fix bug 19017.

pScreen->width/height are not initialized when doing initial mode setting,
which makes this function incorrectly fail. Using scrn->virtualX should work
in all cases though.

Bug 19017 reports a crash in xf86CrtcSetModeTransform when doing a modeset
for output probing, long before the screen array is initialized; that was
caused by a work-around to set pScreen->width/height so that xf86CrtcFitsScreen
could find the right values.

Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Keith Packard 2008-12-15 11:39:24 -08:00
parent 29a5b0596b
commit fde2f96103
2 changed files with 2 additions and 17 deletions

View File

@ -244,8 +244,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
RRTransformPtr transform, int x, int y)
{
ScrnInfoPtr scrn = crtc->scrn;
/* During ScreenInit() scrn->pScreen is still NULL */
ScreenPtr pScreen = screenInfo.screens[scrn->scrnIndex];
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
int i;
Bool ret = FALSE;
@ -295,15 +293,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
} else
crtc->transformPresent = FALSE;
/* We may hit this path during PreInit during load-detcect, at
* which point no pScreens exist yet, so avoid this step. */
if (pScreen) {
/* xf86CrtcFitsScreen() relies on these values being correct. */
/* This should ensure the values are always set at modeset time. */
pScreen->width = scrn->virtualX;
pScreen->height = scrn->virtualY;
}
/* Shift offsets that move us out of virtual size */
if (x + mode->HDisplay > xf86_config->maxWidth ||
y + mode->VDisplay > xf86_config->maxHeight)

View File

@ -364,12 +364,8 @@ static Bool
xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb)
{
ScrnInfoPtr pScrn = crtc->scrn;
/* if this is called during ScreenInit() we don't have pScrn->pScreen yet */
ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
BoxRec b;
if (!pScreen)
return TRUE;
b.x1 = 0;
b.y1 = 0;
b.x2 = crtc->mode.HDisplay;
@ -383,8 +379,8 @@ xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb)
b.y2 += crtc->y;
}
return (0 <= b.x1 && b.x2 <= pScreen->width &&
0 <= b.y1 && b.y2 <= pScreen->height);
return (0 <= b.x1 && b.x2 <= pScrn->virtualX &&
0 <= b.y1 && b.y2 <= pScrn->virtualY);
}
Bool