Xnest: Implement xnestModifyPixmapHeader
Xnest variant of ModifyPixmapHeader that creates new Pixmap in parent X server if it's size is modified from 0x0 to anything bigger. xnestCreatePixmap doesn't create pixmap in parent X server if it has dimensions 0x0. If it is later resized and accessed, Xnest will be aborted with BadDrawable error from parent X server because it will use XID 0. This happens with ScratchPixmap, for example as used from XaceCensorImage. Applications using XACE crash Xnest. Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
parent
132507eba9
commit
b902c8abb6
|
@ -78,6 +78,21 @@ xnestDestroyPixmap(PixmapPtr pPixmap)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bool
|
||||||
|
xnestModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, int depth,
|
||||||
|
int bitsPerPixel, int devKind, pointer pPixData)
|
||||||
|
{
|
||||||
|
if(!xnestPixmapPriv(pPixmap)->pixmap && width > 0 && height > 0) {
|
||||||
|
xnestPixmapPriv(pPixmap)->pixmap =
|
||||||
|
XCreatePixmap(xnestDisplay,
|
||||||
|
xnestDefaultWindows[pPixmap->drawable.pScreen->myNum],
|
||||||
|
width, height, depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
return miModifyPixmapHeader(pPixmap, width, height, depth,
|
||||||
|
bitsPerPixel, devKind, pPixData);
|
||||||
|
}
|
||||||
|
|
||||||
RegionPtr
|
RegionPtr
|
||||||
xnestPixmapToRegion(PixmapPtr pPixmap)
|
xnestPixmapToRegion(PixmapPtr pPixmap)
|
||||||
{
|
{
|
||||||
|
|
|
@ -282,6 +282,7 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
|
||||||
|
|
||||||
pScreen->CreatePixmap = xnestCreatePixmap;
|
pScreen->CreatePixmap = xnestCreatePixmap;
|
||||||
pScreen->DestroyPixmap = xnestDestroyPixmap;
|
pScreen->DestroyPixmap = xnestDestroyPixmap;
|
||||||
|
pScreen->ModifyPixmapHeader = xnestModifyPixmapHeader;
|
||||||
|
|
||||||
/* Font procedures */
|
/* Font procedures */
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,8 @@ typedef struct {
|
||||||
PixmapPtr xnestCreatePixmap(ScreenPtr pScreen, int width, int height,
|
PixmapPtr xnestCreatePixmap(ScreenPtr pScreen, int width, int height,
|
||||||
int depth, unsigned usage_hint);
|
int depth, unsigned usage_hint);
|
||||||
Bool xnestDestroyPixmap(PixmapPtr pPixmap);
|
Bool xnestDestroyPixmap(PixmapPtr pPixmap);
|
||||||
|
Bool xnestModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, int depth,
|
||||||
|
int bitsPerPixel, int devKind, pointer pPixData);
|
||||||
RegionPtr xnestPixmapToRegion(PixmapPtr pPixmap);
|
RegionPtr xnestPixmapToRegion(PixmapPtr pPixmap);
|
||||||
|
|
||||||
#endif /* XNESTPIXMAP_H */
|
#endif /* XNESTPIXMAP_H */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user