Avoid excessive heap memory reallocation when generating EMF
metarecords in memory.
diff --git a/dlls/gdi/enhmfdrv/init.c b/dlls/gdi/enhmfdrv/init.c
index 4c7323b..9ce5460 100644
--- a/dlls/gdi/enhmfdrv/init.c
+++ b/dlls/gdi/enhmfdrv/init.c
@@ -185,12 +185,16 @@
if (!WriteFile(physDev->hFile, (char *)emr, emr->nSize, NULL, NULL))
return FALSE;
} else {
- len = physDev->emh->nBytes;
- emh = HeapReAlloc( GetProcessHeap(), 0, physDev->emh, len );
- if (!emh) return FALSE;
- physDev->emh = emh;
- memcpy((CHAR *)physDev->emh + physDev->emh->nBytes - emr->nSize, emr,
- emr->nSize);
+ DWORD nEmfSize = HeapSize(GetProcessHeap(), 0, physDev->emh);
+ len = physDev->emh->nBytes;
+ if (len > nEmfSize) {
+ nEmfSize += (nEmfSize / 2) + emr->nSize;
+ emh = HeapReAlloc(GetProcessHeap(), 0, physDev->emh, nEmfSize);
+ if (!emh) return FALSE;
+ physDev->emh = emh;
+ }
+ memcpy((CHAR *)physDev->emh + physDev->emh->nBytes - emr->nSize, emr,
+ emr->nSize);
}
return TRUE;
}