Author: tkreuzer
Date: Wed Mar  2 13:23:13 2011
New Revision: 50956

URL: http://svn.reactos.org/svn/reactos?rev=50956&view=rev
Log:
[USER32]
Patch by Thomas Faber:
When the Edit receives WM_KILLFOCUS, it will notify its parent (the ListView)
of losing focus, which in turn will send WM_CLOSE to destroy the edit control.
This will cause the edit to receive WM_DESTROY and free the EDITSTATE.
When control returns to the WM_KILLFOCUS handler, this would call
EDIT_UnlockBuffer on the now invalid EDITSTATE.
Fix this by checking the validity of the EDITSTATE before calling 
EDIT_UnlockBuffer.
Fixes explorer crash, when cancelling file renaming.
See issue #5895 for more details.

Modified:
    trunk/reactos/dll/win32/user32/controls/edit.c

Modified: trunk/reactos/dll/win32/user32/controls/edit.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/controls/edit.c?rev=50956&r1=50955&r2=50956&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] Wed Mar  2 
13:23:13 2011
@@ -4721,7 +4721,7 @@
 
        case WM_NCDESTROY:
                result = EDIT_WM_NCDestroy(es);
-               es = NULL;
+//             es = NULL; reactos
 #ifdef __REACTOS__
                 NtUserSetWindowFNID(hwnd, FNID_DESTROY);
 #endif
@@ -5009,7 +5009,9 @@
                break;
        }
 
-       if (IsWindow(hwnd) && es) EDIT_UnlockBuffer(es, FALSE);
+       /* reactos: check GetWindowLong in case es has been destroyed during 
processing */
+       if (IsWindow(hwnd) && es && GetWindowLongPtrW(hwnd, 0))
+               EDIT_UnlockBuffer(es, FALSE);
 
         TRACE("hwnd=%p msg=%x (%s) -- 0x%08lx\n", hwnd, msg, 
SPY_GetMsgName(msg, hwnd), result);
 


Reply via email to