diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2008-01-18 20:53:52 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2008-01-18 20:53:52 +0000 |
commit | dbdc39552e0c86052a62e70f797262fe2319491e (patch) | |
tree | 3e20b75e0966d801491cd8c66d4baef59bd29c39 | |
parent | 63044a8336fea3ae7debede4e1888aaa68ea8b43 (diff) |
Previous shm fix for CVE-2007-6429 was incorrect.
Don't spuriously reject <8bpp shm pixmaps. From X.Org repository.
-rw-r--r-- | xserver/Xext/shm.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/xserver/Xext/shm.c b/xserver/Xext/shm.c index 5633be904..6f99e9064 100644 --- a/xserver/Xext/shm.c +++ b/xserver/Xext/shm.c @@ -737,14 +737,6 @@ ProcPanoramiXShmCreatePixmap( } if (width > 32767 || height > 32767) return BadAlloc; - size = PixmapBytePad(width, depth) * height; - if (sizeof(size) == 4) { - if (size < width * height) - return BadAlloc; - /* thankfully, offset is unsigned */ - if (stuff->offset + size < size) - return BadAlloc; - } if (stuff->depth != 1) { @@ -755,7 +747,17 @@ ProcPanoramiXShmCreatePixmap( client->errorValue = stuff->depth; return BadValue; } + CreatePmap: + size = PixmapBytePad(width, depth) * height; + if (sizeof(size) == 4 && BitsPerPixel(depth) > 8) { + if (size < width * height) + return BadAlloc; + /* thankfully, offset is unsigned */ + if (stuff->offset + size < size) + return BadAlloc; + } + VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client); if(!(newPix = (PanoramiXRes *) xalloc(sizeof(PanoramiXRes)))) @@ -1080,14 +1082,6 @@ ProcShmCreatePixmap(client) } if (width > 32767 || height > 32767) return BadAlloc; - size = PixmapBytePad(width, depth) * height; - if (sizeof(size) == 4) { - if (size < width * height) - return BadAlloc; - /* thankfully, offset is unsigned */ - if (stuff->offset + size < size) - return BadAlloc; - } if (stuff->depth != 1) { @@ -1098,7 +1092,17 @@ ProcShmCreatePixmap(client) client->errorValue = stuff->depth; return BadValue; } + CreatePmap: + size = PixmapBytePad(width, depth) * height; + if (sizeof(size) == 4 && BitsPerPixel(depth) > 8) { + if (size < width * height) + return BadAlloc; + /* thankfully, offset is unsigned */ + if (stuff->offset + size < size) + return BadAlloc; + } + VERIFY_SHMSIZE(shmdesc, stuff->offset, size, client); pMap = (*shmFuncs[pDraw->pScreen->myNum]->CreatePixmap)( pDraw->pScreen, stuff->width, |