summaryrefslogtreecommitdiff
path: root/hw/xfree86/modes
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2008-03-21 03:16:09 -0700
committerKeith Packard <keithp@keithp.com>2008-11-24 13:24:41 -0800
commit7236fd9dd4e9f5c4cb5bafa5c2a18cff12a0444c (patch)
tree9221dd5bbceb27abb32c8d9c0e0efedc5edf8afc /hw/xfree86/modes
parent7e69e364d2ef146d8ec3651d04bdd6d641017449 (diff)
Be careful about copying transforms around; they have allocated memory.
Diffstat (limited to 'hw/xfree86/modes')
-rw-r--r--hw/xfree86/modes/xf86Crtc.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index d24fc86f0..7dce1abf3 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -271,7 +271,10 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
saved_x = crtc->x;
saved_y = crtc->y;
saved_rotation = crtc->rotation;
- saved_transform = crtc->transform;
+ if (crtc->transformPresent) {
+ RRTransformInit (&saved_transform);
+ RRTransformCopy (&saved_transform, &crtc->transform);
+ }
saved_transform_present = crtc->transformPresent;
/* Update crtc values up front so the driver can rely on them for mode
@@ -283,7 +286,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati
crtc->rotation = rotation;
if (transform) {
RRTransformCopy (&crtc->transform, transform);
- crtc->transform = *transform;
crtc->transformPresent = TRUE;
} else
crtc->transformPresent = FALSE;
@@ -380,7 +382,8 @@ done:
crtc->y = saved_y;
crtc->rotation = saved_rotation;
crtc->mode = saved_mode;
- crtc->transform = saved_transform;
+ if (saved_transform_present)
+ RRTransformCopy (&crtc->transform, &saved_transform);
crtc->transformPresent = saved_transform_present;
}