Added sanity checks on EMRCREATEDIBPATTERNBRUSHPT values.
Fix a memory leak.

diff --git a/objects/enhmetafile.c b/objects/enhmetafile.c
index fcf52e5..9a99c9d 100644
--- a/objects/enhmetafile.c
+++ b/objects/enhmetafile.c
@@ -1148,11 +1148,27 @@
     case EMR_CREATEDIBPATTERNBRUSHPT:
       {
         PEMRCREATEDIBPATTERNBRUSHPT lpCreate = (PEMRCREATEDIBPATTERNBRUSHPT)mr;
+        LPVOID lpPackedStruct;
+
+        /* check that offsets and data are contained within the record */
+        if ( !( (lpCreate->cbBmi>=0) && (lpCreate->cbBits>=0) &&
+                (lpCreate->offBmi>=0) && (lpCreate->offBits>=0) &&
+                ((lpCreate->offBmi +lpCreate->cbBmi ) <= mr->nSize) &&
+                ((lpCreate->offBits+lpCreate->cbBits) <= mr->nSize) ) )
+        {
+            ERR("Invalid EMR_CREATEDIBPATTERNBRUSHPT record\n");
+            break;
+        }
 
         /* This is a BITMAPINFO struct followed directly by bitmap bits */
-        LPVOID lpPackedStruct = HeapAlloc( GetProcessHeap(),
-                                           0,
-                                           lpCreate->cbBmi + lpCreate->cbBits );
+        lpPackedStruct = HeapAlloc( GetProcessHeap(), 0,
+                                    lpCreate->cbBmi + lpCreate->cbBits );
+        if(!lpPackedStruct)
+        {
+	    SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+            break;
+        }
+
         /* Now pack this structure */
         memcpy( lpPackedStruct,
                 ((BYTE*)lpCreate) + lpCreate->offBmi,
@@ -1165,6 +1181,8 @@
            CreateDIBPatternBrushPt( lpPackedStruct,
                                     (UINT)lpCreate->iUsage );
 
+        HeapFree(GetProcessHeap(), 0, lpPackedStruct);
+
         break;
       }