--- xf86Crtc.c.orig 2011-12-20 11:50:19.713798292 -0600 +++ xf86Crtc.c 2011-12-20 13:32:52.434072752 -0600 @@ -2481,7 +2481,7 @@ if (mode && crtc) { - crtc->desiredMode = *mode; + xf86_set_crtc_desired_mode_internal(crtc, mode); //crtc->desiredMode = *mode; // tpd - 12/20/2011 - Added xf86_set_crtc_desired_mode_internal() crtc->desiredRotation = output->initial_rotation; crtc->desiredX = output->initial_x; crtc->desiredY = output->initial_y; @@ -2610,6 +2610,24 @@ } } +// tpd - 12/20/2011 - Added xf86_set_crtc_desired_mode_internal() function to copy the name of +// the mode when creating copy of desired mode. Before the pointer was copied +// instead of allocating new space for a copy of the name. The original mode +// was then later freed, leaving the desiredMode copy pointing to freed memory +// for the name. +void +xf86_set_crtc_desired_mode_internal(xf86CrtcPtr crtc, DisplayModePtr mode) { + if (crtc->desiredMode.name != NULL) { + free(crtc->desiredMode.name); + crtc->desiredMode.name = NULL; + } + + crtc->desiredMode = *mode; + if (mode->name != NULL) { + crtc->desiredMode.name = strdup(mode->name); + } +} + /* * Using the desired mode information in each crtc, set * modes (used in EnterVT functions, or at server startup) @@ -2663,7 +2681,7 @@ if (!mode) return FALSE; - crtc->desiredMode = *mode; + xf86_set_crtc_desired_mode_internal(crtc, mode); //crtc->desiredMode = *mode; // // tpd - 12/20/2011 - Added xf86_set_crtc_desired_mode_internal() crtc->desiredRotation = RR_Rotate_0; crtc->desiredTransformPresent = FALSE; crtc->desiredX = 0; @@ -2810,7 +2828,7 @@ ok = FALSE; else { - crtc->desiredMode = *crtc_mode; + xf86_set_crtc_desired_mode_internal(crtc, crtc_mode); // crtc->desiredMode = *crtc_mode; // tpd - 12/20/2011 - Added xf86_set_crtc_desired_mode_internal() crtc->desiredRotation = rotation; crtc->desiredTransformPresent = FALSE; crtc->desiredX = 0; --- xf86Crtc.h.orig 2011-12-20 11:50:32.079799122 -0600 +++ xf86Crtc.h 2011-12-20 11:53:11.716809840 -0600 @@ -993,4 +993,8 @@ extern _X_EXPORT Bool xf86_crtc_supports_gamma(ScrnInfoPtr pScrn); +// tpd - 12/20/2011 - Added xf86_set_crtc_desired_mode_internal() +void +_X_INTERNAL xf86_set_crtc_desired_mode_internal(xf86CrtcPtr crtc, DisplayModePtr mode); + #endif /* _XF86CRTC_H_ */ --- xf86RandR12.c.orig 2011-12-20 11:51:13.296801890 -0600 +++ xf86RandR12.c 2011-12-20 11:53:11.754809842 -0600 @@ -1236,7 +1236,7 @@ /* * Save the last successful setting for EnterVT */ - crtc->desiredMode = mode; + xf86_set_crtc_desired_mode_internal(crtc, &mode); // crtc->desiredMode = mode; // tpd - 12/20/2011 - Added xf86_set_crtc_desired_mode_internal() crtc->desiredRotation = rotation; if (transform) { crtc->desiredTransform = *transform;