diff --git a/commit-184e571.diff b/commit-184e571.diff new file mode 100644 index 0000000..c5208f9 --- /dev/null +++ b/commit-184e571.diff @@ -0,0 +1,53 @@ +commit 184e571957f697f2a125dc9c9da0c7dfb92c2cd9 +Author: Matthias Hopf +Date: Tue Nov 20 13:05:26 2007 +0100 + + Adjust offsets of modes that do not fit virtual screen size. + + Fixes memory corruption if a too small "Virtual" was specified in xorg.conf + for the selected multi-monitor configuration. + +diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c +index 653042c..760a498 100644 +--- a/hw/xfree86/modes/xf86Crtc.c ++++ b/hw/xfree86/modes/xf86Crtc.c +@@ -260,6 +260,30 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, + crtc->y = y; + crtc->rotation = rotation; + ++ /* Shift offsets that move us out of virtual size */ ++ if (x + mode->HDisplay > xf86_config->maxWidth || ++ y + mode->VDisplay > xf86_config->maxHeight) ++ { ++ if (x + mode->HDisplay > xf86_config->maxWidth) ++ crtc->x = xf86_config->maxWidth - mode->HDisplay; ++ if (y + mode->VDisplay > xf86_config->maxHeight) ++ crtc->y = xf86_config->maxHeight - mode->VDisplay; ++ if (crtc->x < 0 || crtc->y < 0) ++ { ++ xf86DrvMsg (scrn->scrnIndex, X_ERROR, ++ "Mode %dx%d does not fit virtual size %dx%d - " ++ "internal error\n", mode->HDisplay, mode->VDisplay, ++ xf86_config->maxWidth, xf86_config->maxHeight); ++ goto done; ++ } ++ xf86DrvMsg (scrn->scrnIndex, X_ERROR, ++ "Mode %dx%d+%d+%d does not fit virtual size %dx%d - " ++ "offset updated to +%d+%d\n", ++ mode->HDisplay, mode->VDisplay, x, y, ++ xf86_config->maxWidth, xf86_config->maxHeight, ++ crtc->x, crtc->y); ++ } ++ + /* XXX short-circuit changes to base location only */ + + /* Pass our mode to the outputs and the CRTC to give them a chance to +@@ -301,7 +325,7 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, + /* Set up the DPLL and any output state that needs to adjust or depend + * on the DPLL. + */ +- crtc->funcs->mode_set(crtc, mode, adjusted_mode, x, y); ++ crtc->funcs->mode_set(crtc, mode, adjusted_mode, crtc->x, crtc->y); + for (i = 0; i < xf86_config->num_output; i++) + { + xf86OutputPtr output = xf86_config->output[i]; diff --git a/commit-c6c284e.diff b/commit-c6c284e.diff new file mode 100644 index 0000000..ce1b7be --- /dev/null +++ b/commit-c6c284e.diff @@ -0,0 +1,25 @@ +commit c6c284e64b1f537a3243856cf78cf3f2324e4c2b +Author: Matthias Hopf +Date: Mon Nov 26 15:38:20 2007 +0100 + + Initialize Mode with 0 in xf86RandRModeConvert. + + Asking for trouble if non-initialized values contain random data. + +diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c +index c1a06b2..61a7db3 100644 +--- a/hw/xfree86/modes/xf86RandR12.c ++++ b/hw/xfree86/modes/xf86RandR12.c +@@ -683,11 +683,8 @@ xf86RandRModeConvert (ScrnInfoPtr scrn, + RRModePtr randr_mode, + DisplayModePtr mode) + { +- mode->prev = NULL; +- mode->next = NULL; +- mode->name = NULL; ++ memset(mode, 0, sizeof(DisplayModeRec)); + mode->status = MODE_OK; +- mode->type = 0; + + mode->Clock = randr_mode->mode.dotClock / 1000; + diff --git a/commit-f6401f9.diff b/commit-f6401f9.diff new file mode 100644 index 0000000..6f25ce3 --- /dev/null +++ b/commit-f6401f9.diff @@ -0,0 +1,27 @@ +commit f6401f944d327cc5d9a7ee0bbdf4f7fc8eaa31e8 +Author: Matthias Hopf +Date: Fri Nov 23 16:12:49 2007 +0100 + + Don't segfault if referring to a relative output where no modes survived. + +diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c +index 5a1ed8c..8595d96 100644 +--- a/hw/xfree86/modes/xf86Crtc.c ++++ b/hw/xfree86/modes/xf86Crtc.c +@@ -1079,6 +1079,16 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes) + any_set = TRUE; + continue; + } ++ if (!modes[or]) ++ { ++ xf86DrvMsg (scrn->scrnIndex, X_ERROR, ++ "Cannot position output %s relative to output %s without modes\n", ++ output->name, relative_name); ++ output->initial_x = 0; ++ output->initial_y = 0; ++ any_set = TRUE; ++ continue; ++ } + if (relative->initial_x == POSITION_UNSET) + { + keep_going = TRUE; diff --git a/commit-f7dd0c7.diff b/commit-f7dd0c7.diff new file mode 100644 index 0000000..05bc9a2 --- /dev/null +++ b/commit-f7dd0c7.diff @@ -0,0 +1,24 @@ +commit f7dd0c72b8f861f4d5443a43d1013e3fe3db43ca +Author: Matthias Hopf +Date: Mon Nov 12 15:11:03 2007 +0100 + + Only clear crtc of output if it is the one we're actually working on. + + Upon recreation of the RandR internal data structures in RRCrtcNotify() the + crtc of an output could be NULLed if the crtc was shared (cloned) between two + outputs and one of them got another crtc assigned. + +diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c +index db5007e..43cfb29 100644 +--- a/randr/rrcrtc.c ++++ b/randr/rrcrtc.c +@@ -150,7 +150,8 @@ RRCrtcNotify (RRCrtcPtr crtc, + break; + if (i == numOutputs) + { +- crtc->outputs[j]->crtc = NULL; ++ if (crtc->outputs[j]->crtc == crtc) ++ crtc->outputs[j]->crtc = NULL; + RROutputChanged (crtc->outputs[j], FALSE); + RRCrtcChanged (crtc, FALSE); + } diff --git a/commit-fa19e84.diff b/commit-fa19e84.diff new file mode 100644 index 0000000..e55857f --- /dev/null +++ b/commit-fa19e84.diff @@ -0,0 +1,23 @@ +commit fa19e84714aa84a2f2e817e363d6440349d0b619 +Author: Matthias Hopf +Date: Tue Nov 20 16:54:50 2007 +0100 + + Fix initial placement of LeftOf and Above. + +diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c +index 760a498..5a1ed8c 100644 +--- a/hw/xfree86/modes/xf86Crtc.c ++++ b/hw/xfree86/modes/xf86Crtc.c +@@ -1094,10 +1094,10 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes) + output->initial_x += xf86ModeWidth (modes[or], relative->initial_rotation); + break; + case OPTION_ABOVE: +- output->initial_y -= xf86ModeHeight (modes[or], relative->initial_rotation); ++ output->initial_y -= xf86ModeHeight (modes[o], relative->initial_rotation); + break; + case OPTION_LEFT_OF: +- output->initial_x -= xf86ModeWidth (modes[or], relative->initial_rotation); ++ output->initial_x -= xf86ModeWidth (modes[o], relative->initial_rotation); + break; + default: + break; diff --git a/xorg-x11-server.changes b/xorg-x11-server.changes index 31ed42c..601ceed 100644 --- a/xorg-x11-server.changes +++ b/xorg-x11-server.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Tue Nov 27 19:03:27 CET 2007 - sndirsch@suse.de + +- commit-184e571.diff + * Adjust offsets of modes that do not fit virtual screen size. +- commit-c6c284e.diff + * Initialize Mode with 0 in xf86RandRModeConvert. +- commit-f6401f9.diff + * Don't segfault if referring to a relative output where no modes survived. +- commit-f7dd0c7.diff + * Only clear crtc of output if it is the one we're actually working on. +- commit-fa19e84.diff + * Fix initial placement of LeftOf and Above. + ------------------------------------------------------------------- Thu Nov 22 23:01:03 CET 2007 - sndirsch@suse.de diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index 4b72030..27ccd36 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -21,7 +21,7 @@ BuildRequires: libjpeg-devel Url: http://xorg.freedesktop.org/ %define EXPERIMENTAL 0 Version: 7.3 -Release: 31 +Release: 34 License: X11/MIT BuildRoot: %{_tmppath}/%{name}-%{version}-build Group: System/X11/Servers/XF86_4 @@ -71,6 +71,8 @@ Patch32: acpi_events.diff Patch34: p_pci-off-by-one.diff.ia64 Patch36: libdrm.diff %if %vnc +### Dan Nicholson +#http://www.linuxfromscratch.org/~dnicholson/patches/xorg-server-1.4-vnc.patch Patch39: xorg-server-1.4-vnc.patch Patch40: xorg-server-1.4-vnc-fix.patch Patch43: xorg-server-1.4-vnc-64bit.diff @@ -89,6 +91,11 @@ Patch83: ia64linuxPciInit.diff Patch84: commit-feac075.diff Patch85: commit-29e0e18.diff Patch86: mfb_without_xorg.diff +Patch87: commit-c6c284e.diff +Patch88: commit-f6401f9.diff +Patch89: commit-184e571.diff +Patch90: commit-fa19e84.diff +Patch91: commit-f7dd0c7.diff %description This package contains the X.Org Server. @@ -207,6 +214,11 @@ popd %patch84 -p1 %patch85 -p1 %patch86 -p0 +%patch87 -p1 +%patch88 -p1 +%patch89 -p1 +%patch90 -p1 +%patch91 -p1 %build pushd xorg-docs-* @@ -537,6 +549,17 @@ exit 0 %endif %changelog +* Tue Nov 27 2007 - sndirsch@suse.de +- commit-184e571.diff + * Adjust offsets of modes that do not fit virtual screen size. +- commit-c6c284e.diff + * Initialize Mode with 0 in xf86RandRModeConvert. +- commit-f6401f9.diff + * Don't segfault if referring to a relative output where no modes survived. +- commit-f7dd0c7.diff + * Only clear crtc of output if it is the one we're actually working on. +- commit-fa19e84.diff + * Fix initial placement of LeftOf and Above. * Thu Nov 22 2007 - sndirsch@suse.de - pixman.diff no longer required * Sun Nov 18 2007 - sndirsch@suse.de