Don't unwrap too early in libwfb for Composite.
Don't call fbFinishWrap until the pixman_image_t that stores the pointer is actually freed. This prevents corruption or crashes caused by accessing a wrapped pointer after the wrapping is torn down.
This commit is contained in:
parent
f6aa2200f2
commit
74feba4d77
1
fb/fb.h
1
fb/fb.h
|
@ -2117,6 +2117,7 @@ fbPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what);
|
|||
|
||||
pixman_image_t *image_from_pict (PicturePtr pict,
|
||||
Bool has_clip);
|
||||
void free_pixman_pict (PicturePtr, pixman_image_t *);
|
||||
|
||||
#endif /* _FB_H_ */
|
||||
|
||||
|
|
23
fb/fbpict.c
23
fb/fbpict.c
|
@ -185,15 +185,11 @@ fbComposite (CARD8 op,
|
|||
pixman_image_composite (op, src, mask, dest,
|
||||
xSrc, ySrc, xMask, yMask, xDst, yDst,
|
||||
width, height);
|
||||
|
||||
}
|
||||
|
||||
if (src)
|
||||
pixman_image_unref (src);
|
||||
if (mask)
|
||||
pixman_image_unref (mask);
|
||||
if (dest)
|
||||
pixman_image_unref (dest);
|
||||
|
||||
free_pixman_pict (pSrc, src);
|
||||
free_pixman_pict (pMask, mask);
|
||||
free_pixman_pict (pDst, dest);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -332,8 +328,6 @@ create_bits_picture (PicturePtr pict,
|
|||
/* Indexed table */
|
||||
if (pict->pFormat->index.devPrivate)
|
||||
pixman_image_set_indexed (image, pict->pFormat->index.devPrivate);
|
||||
|
||||
fbFinishAccess (pict->pDrawable);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
@ -379,7 +373,7 @@ set_image_properties (pixman_image_t *image, PicturePtr pict)
|
|||
pixman_image_set_alpha_map (
|
||||
image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y);
|
||||
|
||||
pixman_image_unref (alpha_map);
|
||||
free_pixman_pict (pict->alphaMap, alpha_map);
|
||||
}
|
||||
|
||||
pixman_image_set_component_alpha (image, pict->componentAlpha);
|
||||
|
@ -445,6 +439,13 @@ image_from_pict (PicturePtr pict,
|
|||
return image;
|
||||
}
|
||||
|
||||
void
|
||||
free_pixman_pict (PicturePtr pict, pixman_image_t *image)
|
||||
{
|
||||
if (image && pixman_image_unref (image) && pict->pDrawable)
|
||||
fbFinishAccess (pict->pDrawable);
|
||||
}
|
||||
|
||||
Bool
|
||||
fbPictureInit (ScreenPtr pScreen, PictFormatPtr formats, int nformats)
|
||||
{
|
||||
|
|
|
@ -47,9 +47,7 @@ fbAddTraps (PicturePtr pPicture,
|
|||
|
||||
pixman_add_traps (image, x_off, y_off, ntrap, (pixman_trap_t *)traps);
|
||||
|
||||
fbFinishAccess (pPicture->pDrawable);
|
||||
|
||||
pixman_image_unref (image);
|
||||
free_pixman_pict (pPicture, image);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -65,9 +63,7 @@ fbRasterizeTrapezoid (PicturePtr pPicture,
|
|||
|
||||
pixman_rasterize_trapezoid (image, (pixman_trapezoid_t *)trap, x_off, y_off);
|
||||
|
||||
fbFinishAccess (pPicture->pDrawable);
|
||||
|
||||
pixman_image_unref (image);
|
||||
free_pixman_pict (pPicture, image);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -188,6 +188,7 @@
|
|||
#define fbWinPrivateIndex wfbWinPrivateIndex
|
||||
#define fbZeroLine wfbZeroLine
|
||||
#define fbZeroSegment wfbZeroSegment
|
||||
#define free_pixman_pict wfb_free_pixman_pict
|
||||
#define image_from_pict wfb_image_from_pict
|
||||
#define xxScrPrivateIndex wfbxxScrPrivateIndex
|
||||
#define xxGCPrivateIndex wfbxxGCPrivateIndex
|
||||
|
|
Loading…
Reference in New Issue