Module: wine Branch: master Commit: 2453b6a896a9bd86221422658d0f4944f37b1547 URL: http://source.winehq.org/git/wine.git/?a=commit;h=2453b6a896a9bd86221422658d...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Dec 8 10:32:51 2011 +0100
winex11: Add some sanity checks on bitmap formats before creating a pixmap.
---
dlls/winex11.drv/bitmap.c | 30 ++++++++++-------------------- dlls/winex11.drv/xrender.c | 1 - 2 files changed, 10 insertions(+), 21 deletions(-)
diff --git a/dlls/winex11.drv/bitmap.c b/dlls/winex11.drv/bitmap.c index 09da565..2232c49 100644 --- a/dlls/winex11.drv/bitmap.c +++ b/dlls/winex11.drv/bitmap.c @@ -130,6 +130,16 @@ BOOL X11DRV_create_phys_bitmap( HBITMAP hbitmap, const BITMAP *bitmap, int depth { X_PHYSBITMAP *physBitmap;
+ if (bitmap->bmWidth > 65535 || bitmap->bmHeight > 65535 || bitmap->bmPlanes != 1 || + (bitmap->bmBitsPixel != 1 && bitmap->bmBitsPixel != screen_bpp)) + { + WARN( "Trying to create invalid pixmap %dx%d planes %d bpp %d\n", + bitmap->bmWidth, bitmap->bmHeight, bitmap->bmPlanes, bitmap->bmBitsPixel ); + return FALSE; + } + + TRACE( "(%p) %dx%d %d bpp\n", hbitmap, bitmap->bmWidth, bitmap->bmHeight, bitmap->bmBitsPixel ); + if (!(physBitmap = X11DRV_init_phys_bitmap( hbitmap ))) return FALSE;
physBitmap->depth = depth; @@ -170,28 +180,8 @@ BOOL X11DRV_CreateBitmap( PHYSDEV dev, HBITMAP hbitmap )
if (!GetObjectW( hbitmap, sizeof(bitmap), &bitmap )) return FALSE;
- /* Check parameters */ - if (bitmap.bmPlanes != 1) return FALSE; - - /* check if bpp is compatible with screen depth */ - if (!((bitmap.bmBitsPixel == 1) || (bitmap.bmBitsPixel == screen_bpp))) - { - WARN("Trying to make bitmap with planes=%d, bpp=%d\n", - bitmap.bmPlanes, bitmap.bmBitsPixel); - return FALSE; - } - - TRACE("(%p) %dx%d %d bpp\n", hbitmap, bitmap.bmWidth, bitmap.bmHeight, bitmap.bmBitsPixel); - if (bitmap.bmBitsPixel == 1) - { - if (hbitmap == BITMAP_stock_phys_bitmap.hbitmap) - { - ERR( "called for stock bitmap, please report\n" ); - return FALSE; - } return X11DRV_create_phys_bitmap( hbitmap, &bitmap, 1, FALSE, NULL ); - }
return X11DRV_create_phys_bitmap( hbitmap, &bitmap, screen_depth, (visual->class == TrueColor || visual->class == DirectColor), diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 21c1280..02625eb 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -1303,7 +1303,6 @@ static BOOL xrenderdrv_CreateBitmap( PHYSDEV dev, HBITMAP hbitmap )
if (!GetObjectW( hbitmap, sizeof(bitmap), &bitmap )) return FALSE;
- if (bitmap.bmPlanes != 1) return FALSE; format = get_bitmap_format( bitmap.bmBitsPixel );
if (pict_formats[format])