[PATCH] Xnest: Implement xnestModifyPixmapHeader
Michal Srb
msrb at novell.com
Tue Aug 6 07:56:53 PDT 2013
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.
diff --git a/hw/xnest/Pixmap.c b/hw/xnest/Pixmap.c
index 13e1610..2902acd 100644
--- a/hw/xnest/Pixmap.c
+++ b/hw/xnest/Pixmap.c
@@ -78,6 +78,21 @@ xnestDestroyPixmap(PixmapPtr pPixmap)
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
xnestPixmapToRegion(PixmapPtr pPixmap)
{
diff --git a/hw/xnest/Screen.c b/hw/xnest/Screen.c
index 58b5a11..abb4d37 100644
--- a/hw/xnest/Screen.c
+++ b/hw/xnest/Screen.c
@@ -282,6 +282,7 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
pScreen->CreatePixmap = xnestCreatePixmap;
pScreen->DestroyPixmap = xnestDestroyPixmap;
+ pScreen->ModifyPixmapHeader = xnestModifyPixmapHeader;
/* Font procedures */
diff --git a/hw/xnest/XNPixmap.h b/hw/xnest/XNPixmap.h
index 268ba1e..5b2e796 100644
--- a/hw/xnest/XNPixmap.h
+++ b/hw/xnest/XNPixmap.h
@@ -33,6 +33,8 @@ typedef struct {
PixmapPtr xnestCreatePixmap(ScreenPtr pScreen, int width, int height,
int depth, unsigned usage_hint);
Bool xnestDestroyPixmap(PixmapPtr pPixmap);
+Bool xnestModifyPixmapHeader(PixmapPtr pPixmap, int width, int height, int
depth,
+ int bitsPerPixel, int devKind, pointer
pPixData);
RegionPtr xnestPixmapToRegion(PixmapPtr pPixmap);
#endif /* XNESTPIXMAP_H */
More information about the xorg-devel
mailing list