Alexandre Julliard : user: Added helper functions for buffer management in WINPROC_CallProc32WTo32A..

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 18 09:43:51 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: cb36cbd0aa693444be1d028424b2a5a2ade8c1a3
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=cb36cbd0aa693444be1d028424b2a5a2ade8c1a3

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 18 11:03:30 2006 +0200

user: Added helper functions for buffer management in WINPROC_CallProc32WTo32A..

---

 dlls/user/winproc.c |   25 +++++++++++++++----------
 1 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index a6754de..5db5c90 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -2984,6 +2984,17 @@ static LRESULT WINPROC_CallProc32ATo32W(
 }
 
 
+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(
         {   /* 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(
             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(
                 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;
 




More information about the wine-cvs mailing list