[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'debian-unstable'



 debian/changelog                      |    2 
 debian/patches/19-compresize-fix.diff |  319 ++++++++++++++++++++++++++++++++++
 debian/patches/series                 |    1 
 3 files changed, 322 insertions(+)

New commits:
commit e42902c2044c0a4ed363698966c0cfc0d528dcd7
Author: Julien Cristau <jcristau@debian.org>
Date:   Mon Jul 5 00:04:03 2010 +0100

    Fix crash in composite on big allocation
    
    Add patch from Dave Airlie to fix crash in composite on allocation failure
    (closes: #588046).

diff --git a/debian/changelog b/debian/changelog
index 928c2af..b85f3d8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -4,6 +4,8 @@ xorg-server (2:1.7.7-3) UNRELEASED; urgency=low
   * Add Breaks on drivers abandoned between lenny and squeeze.  This helps apt
     decide to remove them instead of removing all of X.  Thanks, David
     Kalnischkies!
+  * Add patch from Dave Airlie to fix crash in composite on allocation
+    failure (closes: #588046).
 
  -- Julien Cristau <jcristau@debian.org>  Thu, 17 Jun 2010 15:15:20 +0100
 
diff --git a/debian/patches/19-compresize-fix.diff b/debian/patches/19-compresize-fix.diff
new file mode 100644
index 0000000..a211093
--- /dev/null
+++ b/debian/patches/19-compresize-fix.diff
@@ -0,0 +1,319 @@
+From 08bc76d60fdd39cf6d09e28070f37a0ad620adab Mon Sep 17 00:00:00 2001
+From: Fedora X Ninjas <airlied@redhat.com>
+Date: Fri, 4 Jun 2010 11:02:58 +1000
+Subject: [PATCH 2/8] composite fixes backported
+
+squashes three upstream patches
+composite: use config notify hook to do pixmap resize. (v3) - backported to avoid ABI breakage
+composite: initialise pOldPixmap to NullPixmap at alloc time.
+composite: fix freeing of old pixmap until after move/resize/cbw
+
+misapplied - fixup
+---
+ composite/compalloc.c  |    1 +
+ composite/compinit.c   |    3 +-
+ composite/compint.h    |   11 ++--
+ composite/compwindow.c |  124 +++++++++++++++--------------------------------
+ dix/window.c           |   18 +++++++-
+ include/window.h       |   11 ++++
+ 6 files changed, 77 insertions(+), 91 deletions(-)
+
+diff --git a/composite/compalloc.c b/composite/compalloc.c
+index 73adc72..8a6beb9 100644
+--- a/composite/compalloc.c
++++ b/composite/compalloc.c
+@@ -143,6 +143,7 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
+ 	cw->oldy = COMP_ORIGIN_INVALID;
+ 	cw->damageRegistered = FALSE;
+ 	cw->damaged = FALSE;
++	cw->pOldPixmap = NullPixmap;
+ 	dixSetPrivate(&pWin->devPrivates, CompWindowPrivateKey, cw);
+     }
+     ccw->next = cw->clients;
+diff --git a/composite/compinit.c b/composite/compinit.c
+index e8b563d..2ee9332 100644
+--- a/composite/compinit.c
++++ b/composite/compinit.c
+@@ -69,6 +69,7 @@ compCloseScreen (int index, ScreenPtr pScreen)
+     pScreen->InstallColormap = cs->InstallColormap;
+     pScreen->ChangeWindowAttributes = cs->ChangeWindowAttributes;
+     pScreen->ReparentWindow = cs->ReparentWindow;
++
+     pScreen->MoveWindow = cs->MoveWindow;
+     pScreen->ResizeWindow = cs->ResizeWindow;
+     pScreen->ChangeBorderWidth = cs->ChangeBorderWidth;
+@@ -389,6 +390,6 @@ compScreenInit (ScreenPtr pScreen)
+     dixSetPrivate(&pScreen->devPrivates, CompScreenPrivateKey, cs);
+ 
+     RegisterRealChildHeadProc(CompositeRealChildHead);
+-
++    RegisterCompositeConfigNotifyProc(compConfigNotify);
+     return TRUE;
+ }
+diff --git a/composite/compint.h b/composite/compint.h
+index 845a196..a959ad5 100644
+--- a/composite/compint.h
++++ b/composite/compint.h
+@@ -126,14 +126,11 @@ typedef struct _CompScreen {
+     RealizeWindowProcPtr	RealizeWindow;
+     UnrealizeWindowProcPtr	UnrealizeWindow;
+     ClipNotifyProcPtr		ClipNotify;
+-    /*
+-     * Called from ConfigureWindow, these
+-     * three track changes to the offscreen storage
+-     * geometry
+-     */
++
+     MoveWindowProcPtr		MoveWindow;
+     ResizeWindowProcPtr		ResizeWindow;
+     ChangeBorderWidthProcPtr	ChangeBorderWidth;
++
+     /*
+      * Reparenting has an effect on Subwindows redirect
+      */
+@@ -316,4 +313,8 @@ CompositeRealChildHead (WindowPtr pWin);
+ int
+ DeleteWindowNoInputDevices(pointer value, XID wid);
+ 
++int
++compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
++		 int bw, WindowPtr pSib);
++
+ #endif /* _COMPINT_H_ */
+diff --git a/composite/compwindow.c b/composite/compwindow.c
+index 2f5a717..550df39 100644
+--- a/composite/compwindow.c
++++ b/composite/compwindow.c
+@@ -334,37 +334,9 @@ compImplicitRedirect (WindowPtr pWin, WindowPtr pParent)
+     return FALSE;
+ }
+ 
+-void
+-compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind)
++static void compFreeOldPixmap(WindowPtr pWin)
+ {
+     ScreenPtr		pScreen = pWin->drawable.pScreen;
+-    CompScreenPtr	cs = GetCompScreen (pScreen);
+-
+-    compCheckTree (pScreen);
+-    if (pWin->redirectDraw != RedirectDrawNone)
+-    {
+-	WindowPtr		pParent;
+-	int			draw_x, draw_y;
+-	unsigned int		w, h, bw;
+-
+-	/* if this is a root window, can't be moved */
+-	if (!(pParent = pWin->parent))
+-	   return;
+-
+-	bw = wBorderWidth (pWin);
+-	draw_x = pParent->drawable.x + x + (int)bw;
+-	draw_y = pParent->drawable.y + y + (int)bw;
+-	w = pWin->drawable.width;
+-	h = pWin->drawable.height;
+-	compReallocPixmap (pWin, draw_x, draw_y, w, h, bw);
+-    }
+-    compCheckTree (pScreen);
+-
+-    pScreen->MoveWindow = cs->MoveWindow;
+-    (*pScreen->MoveWindow) (pWin, x, y, pSib, kind);
+-    cs->MoveWindow = pScreen->MoveWindow;
+-    pScreen->MoveWindow = compMoveWindow;
+-
+     if (pWin->redirectDraw != RedirectDrawNone)
+     {
+ 	CompWindowPtr	cw = GetCompWindow (pWin);
+@@ -374,7 +346,19 @@ compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind)
+ 	    cw->pOldPixmap = NullPixmap;
+ 	}
+     }
++}
++void
++compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind)
++{
++    ScreenPtr		pScreen = pWin->drawable.pScreen;
++    CompScreenPtr	cs = GetCompScreen (pScreen);
++
++    pScreen->MoveWindow = cs->MoveWindow;
++    (*pScreen->MoveWindow) (pWin, x, y, pSib, kind);
++    cs->MoveWindow = pScreen->MoveWindow;
++    pScreen->MoveWindow = compMoveWindow;
+ 
++    compFreeOldPixmap(pWin);
+     compCheckTree (pScreen);
+ }
+ 
+@@ -385,37 +369,12 @@ compResizeWindow (WindowPtr pWin, int x, int y,
+     ScreenPtr		pScreen = pWin->drawable.pScreen;
+     CompScreenPtr	cs = GetCompScreen (pScreen);
+ 
+-    compCheckTree (pScreen);
+-    if (pWin->redirectDraw != RedirectDrawNone)
+-    {
+-	WindowPtr		pParent;
+-	int			draw_x, draw_y;
+-	unsigned int		bw;
+-
+-	/* if this is a root window, can't be moved */
+-	if (!(pParent = pWin->parent))
+-	   return;
+-
+-	bw = wBorderWidth (pWin);
+-	draw_x = pParent->drawable.x + x + (int)bw;
+-	draw_y = pParent->drawable.y + y + (int)bw;
+-	compReallocPixmap (pWin, draw_x, draw_y, w, h, bw);
+-    }
+-    compCheckTree (pScreen);
+-
+     pScreen->ResizeWindow = cs->ResizeWindow;
+     (*pScreen->ResizeWindow) (pWin, x, y, w, h, pSib);
+     cs->ResizeWindow = pScreen->ResizeWindow;
+     pScreen->ResizeWindow = compResizeWindow;
+-    if (pWin->redirectDraw != RedirectDrawNone)
+-    {
+-	CompWindowPtr	cw = GetCompWindow (pWin);
+-	if (cw->pOldPixmap)
+-	{
+-	    (*pScreen->DestroyPixmap) (cw->pOldPixmap);
+-	    cw->pOldPixmap = NullPixmap;
+-	}
+-    }
++
++    compFreeOldPixmap(pWin);
+     compCheckTree (pWin->drawable.pScreen);
+ }
+ 
+@@ -425,38 +384,12 @@ compChangeBorderWidth (WindowPtr pWin, unsigned int bw)
+     ScreenPtr		pScreen = pWin->drawable.pScreen;
+     CompScreenPtr	cs = GetCompScreen (pScreen);
+ 
+-    compCheckTree (pScreen);
+-    if (pWin->redirectDraw != RedirectDrawNone)
+-    {
+-	WindowPtr		pParent;
+-	int			draw_x, draw_y;
+-	unsigned int		w, h;
+-
+-	/* if this is a root window, can't be moved */
+-	if (!(pParent = pWin->parent))
+-	   return;
+-
+-	draw_x = pWin->drawable.x;
+-	draw_y = pWin->drawable.y;
+-	w = pWin->drawable.width;
+-	h = pWin->drawable.height;
+-	compReallocPixmap (pWin, draw_x, draw_y, w, h, bw);
+-    }
+-    compCheckTree (pScreen);
+-
+     pScreen->ChangeBorderWidth = cs->ChangeBorderWidth;
+     (*pScreen->ChangeBorderWidth) (pWin, bw);
+     cs->ChangeBorderWidth = pScreen->ChangeBorderWidth;
+     pScreen->ChangeBorderWidth = compChangeBorderWidth;
+-    if (pWin->redirectDraw != RedirectDrawNone)
+-    {
+-	CompWindowPtr	cw = GetCompWindow (pWin);
+-	if (cw->pOldPixmap)
+-	{
+-	    (*pScreen->DestroyPixmap) (cw->pOldPixmap);
+-	    cw->pOldPixmap = NullPixmap;
+-	}
+-    }
++
++    compFreeOldPixmap(pWin);
+     compCheckTree (pWin->drawable.pScreen);
+ }
+ 
+@@ -822,3 +755,26 @@ CompositeRealChildHead (WindowPtr pWin)
+ 	return pChildBefore;
+     }
+ }
++
++int
++compConfigNotify(WindowPtr pWin, int x, int y, int w, int h,
++		 int bw, WindowPtr pSib)
++{
++    ScreenPtr		pScreen = pWin->drawable.pScreen;
++    WindowPtr		pParent = pWin->parent;
++    int			draw_x, draw_y;
++    Bool alloc_ret;
++
++    if (pWin->redirectDraw == RedirectDrawNone)
++	return Success;
++
++    compCheckTree (pScreen);
++
++    draw_x = pParent->drawable.x + x + bw;
++    draw_y = pParent->drawable.y + y + bw;
++    alloc_ret = compReallocPixmap (pWin, draw_x, draw_y, w, h, bw);
++
++    if (alloc_ret == FALSE)
++	return BadAlloc;
++    return Success;
++}
+diff --git a/dix/window.c b/dix/window.c
+index e191f09..e4c850f 100644
+--- a/dix/window.c
++++ b/dix/window.c
+@@ -2104,6 +2104,13 @@ ReflectStackChange(
+ 	WindowsRestructured ();
+ }
+ 
++static compositeConfigNotifyProcPtr compositeConfigNotify;
++void
++RegisterCompositeConfigNotifyProc(compositeConfigNotifyProcPtr proc)
++{
++    compositeConfigNotify = proc;
++}
++
+ /*****
+  * ConfigureWindow
+  *****/
+@@ -2220,7 +2227,6 @@ ConfigureWindow(WindowPtr pWin, Mask mask, XID *vlist, ClientPtr client)
+     else
+ 	pSib = pWin->nextSib;
+ 
+-
+     if ((!pWin->overrideRedirect) && 
+ 	(RedirectSend(pParent)
+ 	))
+@@ -2305,6 +2311,16 @@ ConfigureWindow(WindowPtr pWin, Mask mask, XID *vlist, ClientPtr client)
+     return(Success);
+ 
+ ActuallyDoSomething:
++    if (compositeConfigNotify)
++    {
++	int ret;
++	ret = compositeConfigNotify(pWin, x, y, w, h, bw, pSib);
++	if (ret) {
++	    client->errorValue = 0;
++	    return ret;
++	}
++    }
++
+     if (SubStrSend(pWin, pParent))
+     {
+ 	memset(&event, 0, sizeof(xEvent));
+diff --git a/include/window.h b/include/window.h
+index 6fb2f8c..ea2edab 100644
+--- a/include/window.h
++++ b/include/window.h
+@@ -266,4 +266,15 @@ extern _X_EXPORT void DisableMapUnmapEvents(
+ extern _X_EXPORT void EnableMapUnmapEvents(
+     WindowPtr /* pWin */ );
+ 
++typedef int (* compositeConfigNotifyProcPtr)(
++    WindowPtr /* pWin */,
++    int /* x */,
++    int /* y */,
++    int /* w */,
++    int /* h */,
++    int /* bw */,
++    WindowPtr /*pSib*/);
++
++_X_EXPORT void RegisterCompositeConfigNotifyProc(compositeConfigNotifyProcPtr proc);
++
+ #endif /* WINDOW_H */
+-- 
+1.7.1
+
diff --git a/debian/patches/series b/debian/patches/series
index d2d315c..78f1dcd 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -17,3 +17,4 @@
 16-xaa-fbcomposite-fix-negative-size.diff
 17-xfree86-saner-conf-search-paths.diff
 18-Add-10-evdev.conf.diff
+19-compresize-fix.diff


Reply to: