Module: wine Branch: master Commit: 1acc6dcc58f08174a08c34fa5a884a1d3b2ee80c URL: http://source.winehq.org/git/wine.git/?a=commit;h=1acc6dcc58f08174a08c34fa5a...
Author: Huw Davies huw@codeweavers.com Date: Thu Sep 29 10:13:12 2016 +0100
riched20: Add checks for allocation failures.
Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 ); }