From: Huw Davies Subject: [PATCH 2/2] riched20: Add checks for allocation failures. Message-Id: <1475140392-38023-2-git-send-email-huw@codeweavers.com> Date: Thu, 29 Sep 2016 10:13:12 +0100 Signed-off-by: Huw Davies --- dlls/riched20/string.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/dlls/riched20/string.c b/dlls/riched20/string.c index 44726b3..ef06bac 100644 --- a/dlls/riched20/string.c +++ b/dlls/riched20/string.c @@ -24,19 +24,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); static int ME_GetOptimalBuffer(int nLen) { - /* FIXME: This seems wasteful for tabs and end of lines strings, - * since they have a small fixed length. */ return ((sizeof(WCHAR) * nLen) + 128) & ~63; } /* Create a buffer (uninitialized string) of size nMaxChars */ static ME_String *ME_MakeStringB(int nMaxChars) { - ME_String *s = ALLOC_OBJ(ME_String); + ME_String *s = heap_alloc( sizeof(*s) ); + if (!s) return NULL; s->nLen = nMaxChars; s->nBuffer = ME_GetOptimalBuffer(s->nLen + 1); - s->szData = ALLOC_N_OBJ(WCHAR, s->nBuffer); + s->szData = heap_alloc( s->nBuffer * sizeof(WCHAR) ); + if (!s->szData) + { + heap_free( s ); + return NULL; + } s->szData[s->nLen] = 0; return s; } @@ -44,7 +48,8 @@ static ME_String *ME_MakeStringB(int nMaxChars) ME_String *ME_MakeStringN(LPCWSTR szText, int nMaxChars) { ME_String *s = ME_MakeStringB(nMaxChars); - /* Native allows NULL chars */ + + if (!s) return NULL; memcpy(s->szData, szText, s->nLen * sizeof(WCHAR)); return s; } @@ -54,6 +59,8 @@ ME_String *ME_MakeStringR(WCHAR cRepeat, int nMaxChars) { int i; ME_String *s = ME_MakeStringB(nMaxChars); + + if (!s) return NULL; for (i = 0; i < nMaxChars; i++) s->szData[i] = cRepeat; return s; @@ -62,20 +69,23 @@ ME_String *ME_MakeStringR(WCHAR cRepeat, int nMaxChars) void ME_DestroyString(ME_String *s) { if (!s) return; - FREE_OBJ(s->szData); - FREE_OBJ(s); + heap_free( s->szData ); + heap_free( s ); } BOOL ME_InsertString(ME_String *s, int ofs, const WCHAR *insert, int len) { DWORD new_len = s->nLen + len + 1; + WCHAR *new; + assert( ofs <= s->nLen ); if( new_len > s->nBuffer ) { s->nBuffer = ME_GetOptimalBuffer( new_len ); - s->szData = heap_realloc( s->szData, s->nBuffer * sizeof(WCHAR) ); - if (!s->szData) return FALSE; + new = heap_realloc( s->szData, s->nBuffer * sizeof(WCHAR) ); + if (!new) return FALSE; + s->szData = new; } memmove( s->szData + ofs + len, s->szData + ofs, (s->nLen - ofs + 1) * sizeof(WCHAR) ); @@ -101,6 +111,8 @@ ME_String *ME_VSplitString(ME_String *orig, int charidx) assert(charidx<=orig->nLen); s = ME_MakeStringN(orig->szData+charidx, orig->nLen-charidx); + if (!s) return NULL; + orig->nLen = charidx; orig->szData[charidx] = '\0'; return s; @@ -163,6 +175,7 @@ ME_CallWordBreakProc(ME_TextEditor *editor, WCHAR *str, INT len, INT start, INT int buffer_size = WideCharToMultiByte(CP_ACP, 0, str, len, NULL, 0, NULL, NULL); char *buffer = heap_alloc(buffer_size); + if (!buffer) return 0; WideCharToMultiByte(CP_ACP, 0, str, len, buffer, buffer_size, NULL, NULL); result = editor->pfnWordBreak((WCHAR*)buffer, start, buffer_size, code); @@ -187,7 +200,7 @@ LPWSTR ME_ToUnicode(LONG codepage, LPVOID psz, INT *len) if(!nChars) return NULL; - if((tmp = ALLOC_N_OBJ(WCHAR, nChars)) != NULL) + if((tmp = heap_alloc( nChars * sizeof(WCHAR) )) != NULL) *len = MultiByteToWideChar(codepage, 0, psz, -1, tmp, nChars) - 1; return tmp; } @@ -196,5 +209,5 @@ LPWSTR ME_ToUnicode(LONG codepage, LPVOID psz, INT *len) void ME_EndToUnicode(LONG codepage, LPVOID psz) { if (codepage != CP_UNICODE) - FREE_OBJ(psz); + heap_free( psz ); } -- 2.8.2