Alexandre Julliard : winex11: Added an exception handler to catch bad pointers in X11DRV_SetImageBits.
Alexandre Julliard
julliard at winehq.org
Mon Mar 10 17:05:04 CDT 2008
Module: wine
Branch: master
Commit: 653c4140b49d3e42563bc69c1f0508f0e82178ed
URL: http://source.winehq.org/git/wine.git/?a=commit;h=653c4140b49d3e42563bc69c1f0508f0e82178ed
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Mar 10 17:22:08 2008 +0100
winex11: Added an exception handler to catch bad pointers in X11DRV_SetImageBits.
---
dlls/winex11.drv/dib.c | 151 ++++++++++++++++++++++++++----------------------
1 files changed, 81 insertions(+), 70 deletions(-)
diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c
index 91aab99..3d7bebf 100644
--- a/dlls/winex11.drv/dib.c
+++ b/dlls/winex11.drv/dib.c
@@ -39,7 +39,7 @@
#include "winbase.h"
#include "wingdi.h"
#include "x11drv.h"
-#include "excpt.h"
+#include "wine/exception.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(bitmap);
@@ -3539,65 +3539,74 @@ static int X11DRV_DIB_SetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr )
bmpImage->red_mask,bmpImage->green_mask,bmpImage->blue_mask);
/* Transfer the pixels */
- switch(descr->infoBpp)
+ __TRY
{
- case 1:
- X11DRV_DIB_SetImageBits_1( descr->lines, descr->bits, descr->infoWidth,
- descr->width, descr->xSrc, (int *)(descr->colorMap),
- bmpImage, descr->dibpitch );
- break;
- case 4:
- if (descr->compression) {
- X11DRV_DIB_SetImageBits_GetSubImage( descr, bmpImage);
- X11DRV_DIB_SetImageBits_RLE4( descr->lines, descr->bits,
- descr->infoWidth, descr->width,
- descr->xSrc, (int *)(descr->colorMap),
- bmpImage );
- } else
- X11DRV_DIB_SetImageBits_4( descr->lines, descr->bits,
- descr->infoWidth, descr->width,
- descr->xSrc, (int*)(descr->colorMap),
- bmpImage, descr->dibpitch );
- break;
- case 8:
- if (descr->compression) {
- X11DRV_DIB_SetImageBits_GetSubImage( descr, bmpImage);
- X11DRV_DIB_SetImageBits_RLE8( descr->lines, descr->bits,
- descr->infoWidth, descr->width,
- descr->xSrc, (int *)(descr->colorMap),
- bmpImage );
- } else
- X11DRV_DIB_SetImageBits_8( descr->lines, descr->bits,
- descr->infoWidth, descr->width,
- descr->xSrc, (int *)(descr->colorMap),
- bmpImage, descr->dibpitch );
- break;
- case 15:
- case 16:
- X11DRV_DIB_SetImageBits_16( descr->lines, descr->bits,
- descr->infoWidth, descr->width,
- descr->xSrc, descr->physDev,
- descr->rMask, descr->gMask, descr->bMask,
- bmpImage, descr->dibpitch);
- break;
- case 24:
- X11DRV_DIB_SetImageBits_24( descr->lines, descr->bits,
- descr->infoWidth, descr->width,
- descr->xSrc, descr->physDev,
- descr->rMask, descr->gMask, descr->bMask,
- bmpImage, descr->dibpitch);
- break;
- case 32:
- X11DRV_DIB_SetImageBits_32( descr->lines, descr->bits,
- descr->infoWidth, descr->width,
- descr->xSrc, descr->physDev,
- descr->rMask, descr->gMask, descr->bMask,
- bmpImage, descr->dibpitch);
- break;
- default:
- WARN("(%d): Invalid depth\n", descr->infoBpp );
- break;
+ switch(descr->infoBpp)
+ {
+ case 1:
+ X11DRV_DIB_SetImageBits_1( descr->lines, descr->bits, descr->infoWidth,
+ descr->width, descr->xSrc, (int *)(descr->colorMap),
+ bmpImage, descr->dibpitch );
+ break;
+ case 4:
+ if (descr->compression) {
+ X11DRV_DIB_SetImageBits_GetSubImage( descr, bmpImage);
+ X11DRV_DIB_SetImageBits_RLE4( descr->lines, descr->bits,
+ descr->infoWidth, descr->width,
+ descr->xSrc, (int *)(descr->colorMap),
+ bmpImage );
+ } else
+ X11DRV_DIB_SetImageBits_4( descr->lines, descr->bits,
+ descr->infoWidth, descr->width,
+ descr->xSrc, (int*)(descr->colorMap),
+ bmpImage, descr->dibpitch );
+ break;
+ case 8:
+ if (descr->compression) {
+ X11DRV_DIB_SetImageBits_GetSubImage( descr, bmpImage);
+ X11DRV_DIB_SetImageBits_RLE8( descr->lines, descr->bits,
+ descr->infoWidth, descr->width,
+ descr->xSrc, (int *)(descr->colorMap),
+ bmpImage );
+ } else
+ X11DRV_DIB_SetImageBits_8( descr->lines, descr->bits,
+ descr->infoWidth, descr->width,
+ descr->xSrc, (int *)(descr->colorMap),
+ bmpImage, descr->dibpitch );
+ break;
+ case 15:
+ case 16:
+ X11DRV_DIB_SetImageBits_16( descr->lines, descr->bits,
+ descr->infoWidth, descr->width,
+ descr->xSrc, descr->physDev,
+ descr->rMask, descr->gMask, descr->bMask,
+ bmpImage, descr->dibpitch);
+ break;
+ case 24:
+ X11DRV_DIB_SetImageBits_24( descr->lines, descr->bits,
+ descr->infoWidth, descr->width,
+ descr->xSrc, descr->physDev,
+ descr->rMask, descr->gMask, descr->bMask,
+ bmpImage, descr->dibpitch);
+ break;
+ case 32:
+ X11DRV_DIB_SetImageBits_32( descr->lines, descr->bits,
+ descr->infoWidth, descr->width,
+ descr->xSrc, descr->physDev,
+ descr->rMask, descr->gMask, descr->bMask,
+ bmpImage, descr->dibpitch);
+ break;
+ default:
+ WARN("(%d): Invalid depth\n", descr->infoBpp );
+ break;
+ }
}
+ __EXCEPT_PAGE_FAULT
+ {
+ WARN( "invalid bits pointer %p\n", descr->bits );
+ lines = 0;
+ }
+ __ENDTRY
TRACE("XPutImage(%ld,%p,%p,%d,%d,%d,%d,%d,%d)\n",
descr->drawable, descr->gc, bmpImage,
@@ -3605,20 +3614,22 @@ static int X11DRV_DIB_SetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr )
descr->width, descr->height);
wine_tsx11_lock();
-#ifdef HAVE_LIBXXSHM
- if (descr->image && descr->useShm)
+ if (lines)
{
- XShmPutImage( gdi_display, descr->drawable, descr->gc, bmpImage,
- descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
- descr->width, descr->height, FALSE );
- XSync( gdi_display, 0 );
- }
- else
+#ifdef HAVE_LIBXXSHM
+ if (descr->image && descr->useShm)
+ {
+ XShmPutImage( gdi_display, descr->drawable, descr->gc, bmpImage,
+ descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
+ descr->width, descr->height, FALSE );
+ XSync( gdi_display, 0 );
+ }
+ else
#endif
- XPutImage( gdi_display, descr->drawable, descr->gc, bmpImage,
- descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
- descr->width, descr->height );
-
+ XPutImage( gdi_display, descr->drawable, descr->gc, bmpImage,
+ descr->xSrc, descr->ySrc, descr->xDest, descr->yDest,
+ descr->width, descr->height );
+ }
if (!descr->image) XDestroyImage( bmpImage );
wine_tsx11_unlock();
return lines;
More information about the wine-cvs
mailing list