Merge 16737 from trunk:
Fix some bugs in DIB mapping code to prevent instant system crashes.
Modified: branches/ros-branch-0_2_7/reactos/subsys/win32k/objects/dib.c
_____
Modified: branches/ros-branch-0_2_7/reactos/subsys/win32k/objects/dib.c
--- branches/ros-branch-0_2_7/reactos/subsys/win32k/objects/dib.c
2005-08-03 17:14:26 UTC (rev 17015)
+++ branches/ros-branch-0_2_7/reactos/subsys/win32k/objects/dib.c
2005-08-03 17:15:11 UTC (rev 17016)
@@ -175,7 +175,7 @@
RECTL DestRect;
XLATEOBJ *XlateObj;
PPALGDI hDCPalette;
- //RGBQUAD *lpRGB;
+ //RGBQUAD *lpRGB;
HPALETTE DDB_Palette, DIB_Palette;
ULONG DDB_Palette_Type, DIB_Palette_Type;
INT DIBWidth;
@@ -190,7 +190,7 @@
//if (ColorUse == DIB_PAL_COLORS)
// lpRGB = DIB_MapPaletteColors(hDC, bmi);
//else
- // lpRGB = &bmi->bmiColors[0];
+ // lpRGB = &bmi->bmiColors;
DestSurf = &bitmap->SurfObj;
@@ -810,6 +810,7 @@
UINT Entries = 0;
BITMAP bm;
SIZEL Size;
+ RGBQUAD *lpRGB;
DPRINT("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld
(%s)\n",
bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount,
@@ -846,7 +847,9 @@
}
if(usage == DIB_PAL_COLORS)
- memcpy(bmi->bmiColors, (UINT *)DIB_MapPaletteColors(dc, bmi),
sizeof(UINT *));
+ lpRGB = DIB_MapPaletteColors(dc, bmi);
+ else
+ lpRGB = bmi->bmiColors;
// Allocate Memory for DIB and fill structure
if (bm.bmBits)
@@ -869,9 +872,9 @@
else switch(bi->biBitCount)
{
case 16:
- dib->dsBitfields[0] = (bi->biCompression == BI_BITFIELDS) ?
*(DWORD *)bmi->bmiColors : 0x7c00;
- dib->dsBitfields[1] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)bmi->bmiColors + 1) : 0x03e0;
- dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)bmi->bmiColors + 2) : 0x001f; break;
+ dib->dsBitfields[0] = (bi->biCompression == BI_BITFIELDS) ?
*(DWORD *)lpRGB : 0x7c00;
+ dib->dsBitfields[1] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)lpRGB + 1) : 0x03e0;
+ dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)lpRGB + 2) : 0x001f; break;
case 24:
dib->dsBitfields[0] = 0xff0000;
@@ -880,9 +883,9 @@
break;
case 32:
- dib->dsBitfields[0] = (bi->biCompression == BI_BITFIELDS) ?
*(DWORD *)bmi->bmiColors : 0xff0000;
- dib->dsBitfields[1] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)bmi->bmiColors + 1) : 0x00ff00;
- dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)bmi->bmiColors + 2) : 0x0000ff;
+ dib->dsBitfields[0] = (bi->biCompression == BI_BITFIELDS) ?
*(DWORD *)lpRGB : 0xff0000;
+ dib->dsBitfields[1] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)lpRGB + 1) : 0x00ff00;
+ dib->dsBitfields[2] = (bi->biCompression == BI_BITFIELDS) ?
*((DWORD *)lpRGB + 2) : 0x0000ff;
break;
}
dib->dshSection = section;
@@ -901,12 +904,20 @@
bm.bmBits);
if (! res)
{
+ if (lpRGB != bmi->bmiColors)
+ {
+ ExFreePool(lpRGB);
+ }
SetLastWin32Error(ERROR_NO_SYSTEM_RESOURCES);
return NULL;
}
bmp = BITMAPOBJ_LockBitmap(res);
if (NULL == bmp)
{
+ if (lpRGB != bmi->bmiColors)
+ {
+ ExFreePool(lpRGB);
+ }
SetLastWin32Error(ERROR_INVALID_HANDLE);
NtGdiDeleteObject(bmp);
return NULL;
@@ -921,7 +932,7 @@
if(bi->biBitCount == 8) { Entries = 256; }
if (Entries)
- bmp->hDIBPalette = PALETTE_AllocPaletteIndexedRGB(Entries,
bmi->bmiColors);
+ bmp->hDIBPalette = PALETTE_AllocPaletteIndexedRGB(Entries,
lpRGB);
else
bmp->hDIBPalette = PALETTE_AllocPalette(PAL_BITFIELDS, 0, NULL,
dib->dsBitfields[0],
@@ -946,6 +957,11 @@
if (res) { BITMAPOBJ_FreeBitmap(res); res = 0; }
}
+ if (lpRGB != bmi->bmiColors)
+ {
+ ExFreePool(lpRGB);
+ }
+
if (bmp)
{
BITMAPOBJ_UnlockBitmap(bmp);
@@ -1097,6 +1113,12 @@
return NULL;
}
+ if (palGDI->Mode != PAL_INDEXED)
+ {
+ PALETTE_UnlockPalette(palGDI);
+ return NULL;
+ }
+
nNumColors = 1 << lpbmi->bmiHeader.biBitCount;
if (lpbmi->bmiHeader.biClrUsed)
{