From cb36cbd0aa693444be1d028424b2a5a2ade8c1a3 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 18 May 2006 11:03:30 +0200 Subject: [PATCH] user: Added helper functions for buffer management in WINPROC_CallProc32WTo32A.. --- dlls/user/winproc.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c index a6754de2e7a..5db5c908cb5 100644 --- a/dlls/user/winproc.c +++ b/dlls/user/winproc.c @@ -2984,6 +2984,17 @@ static LRESULT WINPROC_CallProc32ATo32W( WNDPROC func, HWND hwnd, UINT msg, WPAR } +static inline void *get_buffer( void *static_buffer, size_t size, size_t need ) +{ + if (size >= need) return static_buffer; + return HeapAlloc( GetProcessHeap(), 0, need ); +} + +static inline void free_buffer( void *static_buffer, void *buffer ) +{ + if (buffer != static_buffer) HeapFree( GetProcessHeap(), 0, buffer ); +} + /********************************************************************** * WINPROC_CallProc32WTo32A * @@ -3005,8 +3016,7 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC func, HWND hwnd, UINT msg, WPAR { /* csW->lpszName and csW->lpszClass are NOT supposed to be atoms * at this point. */ - char buffer[1024]; - char *cls = buffer, *name; + char buffer[1024], *cls, *name; CREATESTRUCTW *csW = (CREATESTRUCTW *)lParam; CREATESTRUCTA csA = *(CREATESTRUCTA *)csW; MDICREATESTRUCTA mdi_cs; @@ -3023,11 +3033,7 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC func, HWND hwnd, UINT msg, WPAR else name_lenW = name_lenA = 0; - if (class_lenA + name_lenA + 2 > sizeof(buffer)) - { - cls = HeapAlloc(GetProcessHeap(), 0, class_lenA + name_lenA + 2); - if (!cls) break; - } + if (!(cls = get_buffer( buffer, sizeof(buffer), class_lenA + name_lenA + 2 ))) break; RtlUnicodeToMultiByteN(cls, class_lenA, NULL, csW->lpszClass, class_lenW); cls[class_lenA] = 0; @@ -3049,9 +3055,8 @@ static LRESULT WINPROC_CallProc32WTo32A( WNDPROC func, HWND hwnd, UINT msg, WPAR csA.lpCreateParams = &mdi_cs; } - ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, (LPARAM)&csA ); - - if (cls != buffer) HeapFree(GetProcessHeap(), 0, cls); + ret = WINPROC_CallWndProc(func, hwnd, msg, wParam, (LPARAM)&csA); + free_buffer( buffer, cls ); } break; -- 2.11.4.GIT