summaryrefslogtreecommitdiff
path: root/Xext
diff options
context:
space:
mode:
authorJamey Sharp <jamey@minilop.net>2009-10-28 16:35:28 -0700
committerKeith Packard <keithp@keithp.com>2009-10-28 18:22:54 -0700
commit25979c46b467847ccb54f5c86a1be6b9c303c99a (patch)
tree72e8756db88bbb5eefcb51bcf10397b848a8759d /Xext
parent757c11630d5999ad13dcac79191429badc92a3a6 (diff)
Alloc/free drawables array for each ProcPanoramiXShmGetImage call.
Updates my previous patch, b422b532f3dcab54c53f61a66f2ad76059d1874a. keithp recommended against allocating the drawables array globally, but my updated patch with that fixed isn't the patch that landed. Signed-off-by: Jamey Sharp <jamey@minilop.net> Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'Xext')
-rw-r--r--Xext/shm.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/Xext/shm.c b/Xext/shm.c
index 8106c40b6..9e462f216 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -141,7 +141,6 @@ int BadShmSegCode;
RESTYPE ShmSegType;
static ShmDescPtr Shmsegs;
static Bool sharedPixmaps;
-static DrawablePtr *drawables;
static int shmScrPrivateKeyIndex;
static DevPrivateKey shmScrPrivateKey = &shmScrPrivateKeyIndex;
static int shmPixmapPrivateIndex;
@@ -259,13 +258,6 @@ ShmExtensionInit(INITARGS)
}
#endif
- drawables = xcalloc(screenInfo.numScreens, sizeof(DrawablePtr));
- if (!drawables)
- {
- ErrorF("MIT-SHM extension disabled: no memory for per-screen drawables\n");
- return;
- }
-
sharedPixmaps = xFalse;
{
sharedPixmaps = xTrue;
@@ -618,6 +610,7 @@ static int
ProcPanoramiXShmGetImage(ClientPtr client)
{
PanoramiXRes *draw;
+ DrawablePtr *drawables;
DrawablePtr pDraw;
xShmGetImageReply xgi;
ShmDescPtr shmdesc;
@@ -678,12 +671,19 @@ ProcPanoramiXShmGetImage(ClientPtr client)
return(BadMatch);
}
+ drawables = xcalloc(PanoramiXNumScreens, sizeof(DrawablePtr));
+ if(!drawables)
+ return(BadAlloc);
+
drawables[0] = pDraw;
for(i = 1; i < PanoramiXNumScreens; i++) {
rc = dixLookupDrawable(drawables+i, draw->info[i].id, client, 0,
DixReadAccess);
if (rc != Success)
+ {
+ xfree(drawables);
return rc;
+ }
}
xgi.visual = wVisual(((WindowPtr)pDraw));
@@ -722,6 +722,7 @@ ProcPanoramiXShmGetImage(ClientPtr client)
}
}
}
+ xfree(drawables);
if (client->swapped) {
int n;