xserver: Branch 'master' - 2 commits

James Cloos cloos at kemper.freedesktop.org
Mon May 12 00:03:18 PDT 2008


 composite/compwindow.c |   72 ++++++++++++++++++++++++-------------------------
 1 file changed, 36 insertions(+), 36 deletions(-)

New commits:
commit 04211c3532ca078420e3745a5eac3d9de120bc32
Author: James Cloos <cloos at jhcloos.com>
Date:   Mon May 12 03:03:13 2008 -0400

    Prevent the -wm command line option from causing a SEGV
    
    The -wm (when mapped) option for the BackingStore support has been
    causing the server to dereference a NULL pointer.
    
    This has probably been the case since backing store has been
    implemented on top of Composite.
    
    It looks like (some of?) Composite didn’t expect its WIndowPtr
    argument to be the root window.
    
    In Composite’s compCheckRedirect() function we now avoid calling
    compAllocPixmap() and compFreePixmap() when the pWin pointer’s
    parent member is NULL, as is it the case with a server’s root window.
    
    This addresses:
    
    https://bugs.freedesktop.org/show_bug.cgi?id=15878

diff --git a/composite/compwindow.c b/composite/compwindow.c
index 9c99917..c1657bd 100644
--- a/composite/compwindow.c
+++ b/composite/compwindow.c
@@ -146,7 +146,7 @@ compCheckRedirect (WindowPtr pWin)
     Bool	    should;
 
     should = pWin->realized && (pWin->drawable.class != InputOnly) &&
-	     (cw != NULL);
+	     (cw != NULL) && (pWin->parent != NULL);
 
     /* Never redirect the overlay window */
     if (cs->pOverlayWin != NULL) {
commit 7e768c08f7809b8dba4db1931e63314e2b6e1cfa
Author: James Cloos <cloos at jhcloos.com>
Date:   Mon May 12 02:53:59 2008 -0400

    Clean up whitespace

diff --git a/composite/compwindow.c b/composite/compwindow.c
index c022027..9c99917 100644
--- a/composite/compwindow.c
+++ b/composite/compwindow.c
@@ -54,7 +54,7 @@ compCheckWindow (WindowPtr pWin, pointer data)
     PixmapPtr	pWinPixmap = (*pScreen->GetWindowPixmap) (pWin);
     PixmapPtr	pParentPixmap = pWin->parent ? (*pScreen->GetWindowPixmap) (pWin->parent) : 0;
     PixmapPtr	pScreenPixmap = (*pScreen->GetScreenPixmap) (pScreen);
-    
+
     if (!pWin->parent)
     {
 	assert (pWin->redirectDraw == RedirectDrawNone);
@@ -122,7 +122,7 @@ compSetPixmapVisitWindow (WindowPtr pWindow, pointer data)
     SetWinSize (pWindow);
     SetBorderSize (pWindow);
     if (HasBorder (pWindow))
-	QueueWorkProc (compRepaintBorder, serverClient, 
+	QueueWorkProc (compRepaintBorder, serverClient,
 		       (pointer) pWindow->drawable.id);
     return WT_WALKCHILDREN;
 }
@@ -147,14 +147,14 @@ compCheckRedirect (WindowPtr pWin)
 
     should = pWin->realized && (pWin->drawable.class != InputOnly) &&
 	     (cw != NULL);
-    
+
     /* Never redirect the overlay window */
     if (cs->pOverlayWin != NULL) {
 	if (pWin == cs->pOverlayWin) {
 	    should = FALSE;
 	}
-    }	
-    
+    }
+
     if (should != (pWin->redirectDraw != RedirectDrawNone))
     {
 	if (should)
@@ -276,10 +276,10 @@ compClipNotify (WindowPtr pWin, int dx, int dy)
     ScreenPtr		pScreen = pWin->drawable.pScreen;
     CompScreenPtr	cs = GetCompScreen (pScreen);
     CompWindowPtr	cw = GetCompWindow (pWin);
-    
+
     if (cw)
     {
-	if (cw->borderClipX != pWin->drawable.x || 
+	if (cw->borderClipX != pWin->drawable.x ||
 	    cw->borderClipY != pWin->drawable.y)
 	{
 	    REGION_TRANSLATE (pScreen, &cw->borderClip,
@@ -324,7 +324,7 @@ compImplicitRedirect (WindowPtr pWin, WindowPtr pParent)
 	ScreenPtr	pScreen = pWin->drawable.pScreen;
 	XID		winVisual = wVisual (pWin);
 	XID		parentVisual = wVisual (pParent);
-    
+
 	if (winVisual != parentVisual &&
 	    (compIsAlternateVisual (pScreen, winVisual) ||
 	     compIsAlternateVisual (pScreen, parentVisual)))
@@ -345,11 +345,11 @@ compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind)
 	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;
@@ -390,18 +390,18 @@ compResizeWindow (WindowPtr pWin, int x, int y,
 	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;
@@ -430,11 +430,11 @@ compChangeBorderWidth (WindowPtr pWin, unsigned int bw)
 	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;
@@ -481,13 +481,13 @@ compReparentWindow (WindowPtr pWin, WindowPtr pPriorParent)
      */
     if (compImplicitRedirect (pWin, pWin->parent))
 	compRedirectWindow (serverClient, pWin, CompositeRedirectAutomatic);
-    
+
     /*
      * Allocate any necessary redirect pixmap
      * (this actually should never be true; pWin is always unmapped)
      */
     compCheckRedirect (pWin);
-    
+
     /*
      * Reset pixmap pointers as appropriate
      */
@@ -514,7 +514,7 @@ compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
     {
 	PixmapPtr	pPixmap = (*pScreen->GetWindowPixmap) (pWin);
 	CompWindowPtr	cw = GetCompWindow (pWin);
-	
+
 	assert (cw->oldx != COMP_ORIGIN_INVALID);
 	assert (cw->oldy != COMP_ORIGIN_INVALID);
 	if (cw->pOldPixmap)
@@ -526,7 +526,7 @@ compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 	    RegionRec	rgnDst;
 	    PixmapPtr	pPixmap = (*pScreen->GetWindowPixmap) (pWin);
 	    GCPtr	pGC;
-	    
+
 	    dx = ptOldOrg.x - pWin->drawable.x;
 	    dy = ptOldOrg.y - pWin->drawable.y;
 	    REGION_TRANSLATE(pWin->drawable.pScreen, prgnSrc, -dx, -dy);
@@ -535,10 +535,10 @@ compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 
 	    REGION_INTERSECT(pWin->drawable.pScreen, &rgnDst,
 			     &pWin->borderClip, prgnSrc);
-	    
-	    REGION_TRANSLATE (pWin->drawable.pScreen, &rgnDst, 
+
+	    REGION_TRANSLATE (pWin->drawable.pScreen, &rgnDst,
 			      -pPixmap->screen_x, -pPixmap->screen_y);
-	    
+
 	    dx = dx + pPixmap->screen_x - cw->oldx;
 	    dy = dy + pPixmap->screen_y - cw->oldy;
 	    pGC = GetScratchGC (pPixmap->drawable.depth, pScreen);
@@ -546,7 +546,7 @@ compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 	    {
 		BoxPtr	pBox = REGION_RECTS (&rgnDst);
 		int	nBox = REGION_NUM_RECTS (&rgnDst);
-		
+
 		ValidateGC(&pPixmap->drawable, pGC);
 		while (nBox--)
 		{
@@ -568,7 +568,7 @@ compCopyWindow (WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
 	ptOldOrg.x += dx;
 	ptOldOrg.y += dy;
     }
-    
+
     pScreen->CopyWindow = cs->CopyWindow;
     if (ptOldOrg.x != pWin->drawable.x || ptOldOrg.y != pWin->drawable.y)
     {
@@ -634,7 +634,7 @@ compDestroyWindow (WindowPtr pWin)
 	FreeResource (cw->clients->id, RT_NONE);
     while ((csw = GetCompSubwindows (pWin)))
 	FreeResource (csw->clients->id, RT_NONE);
-    
+
     if (pWin->redirectDraw != RedirectDrawNone)
 	compFreePixmap (pWin);
     ret = (*pScreen->DestroyWindow) (pWin);
@@ -699,7 +699,7 @@ PictFormatPtr
 compWindowFormat (WindowPtr pWin)
 {
     ScreenPtr	pScreen = pWin->drawable.pScreen;
-    
+
     return PictureMatchVisual (pScreen, pWin->drawable.depth,
 			       compGetWindowVisual (pWin));
 }
@@ -716,24 +716,24 @@ compWindowUpdateAutomatic (WindowPtr pWin)
     int		    error;
     RegionPtr	    pRegion = DamageRegion (cw->damage);
     PicturePtr	    pSrcPicture = CreatePicture (0, &pSrcPixmap->drawable,
-						 pSrcFormat, 
+						 pSrcFormat,
 						 0, 0,
 						 serverClient,
 						 &error);
     XID		    subwindowMode = IncludeInferiors;
     PicturePtr	    pDstPicture = CreatePicture (0, &pParent->drawable,
 						 pDstFormat,
-						 CPSubwindowMode, 
+						 CPSubwindowMode,
 						 &subwindowMode,
 						 serverClient,
 						 &error);
-    
+
     /*
      * First move the region from window to screen coordinates
      */
-    REGION_TRANSLATE (pScreen, pRegion, 
+    REGION_TRANSLATE (pScreen, pRegion,
 		      pWin->drawable.x, pWin->drawable.y);
-    
+
     /*
      * Clip against the "real" border clip
      */
@@ -742,14 +742,14 @@ compWindowUpdateAutomatic (WindowPtr pWin)
     /*
      * Now translate from screen to dest coordinates
      */
-    REGION_TRANSLATE (pScreen, pRegion, 
+    REGION_TRANSLATE (pScreen, pRegion,
 		      -pParent->drawable.x, -pParent->drawable.y);
-    
+
     /*
      * Clip the picture
      */
     SetPictureClipRegion (pDstPicture, 0, 0, pRegion);
-    
+
     /*
      * And paint
      */
@@ -813,7 +813,7 @@ CompositeRealChildHead (WindowPtr pWin)
     if (!pChild) {
 	return NullWindow;
     }
-    
+
     cs = GetCompScreen(pWin->drawable.pScreen);
     if (pChild == cs->pOverlayWin) {
 	return pChild;


More information about the xorg-commit mailing list