Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
fed0c33f
Commit
fed0c33f
authored
Nov 02, 2022
by
Nikolay Sivov
Committed by
Alexandre Julliard
Nov 07, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
comctl32/edit: Check for control destruction on notification return.
Based on a patch by Mark Jansen. Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
parent
bae77269
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
28 deletions
+27
-28
edit.c
dlls/comctl32/edit.c
+27
-28
No files found.
dlls/comctl32/edit.c
View file @
fed0c33f
...
...
@@ -154,15 +154,13 @@ typedef struct
#define SWAP_UINT32(x,y) do { UINT temp = (UINT)(x); (x) = (UINT)(y); (y) = temp; } while(0)
#define ORDER_UINT(x,y) do { if ((UINT)(y) < (UINT)(x)) SWAP_UINT32((x),(y)); } while(0)
/* used for disabled or read-only edit control */
#define EDIT_NOTIFY_PARENT(es, wNotifyCode) \
do \
{
/* Notify parent which has created this edit control */
\
TRACE("notification " #wNotifyCode " sent to hwnd=%p\n", es->hwndParent); \
SendMessageW(es->hwndParent, WM_COMMAND, \
MAKEWPARAM(GetWindowLongPtrW((es->hwndSelf),GWLP_ID), wNotifyCode), \
(LPARAM)(es->hwndSelf)); \
} while(0)
static
inline
BOOL
notify_parent
(
const
EDITSTATE
*
es
,
INT
code
)
{
HWND
hwnd
=
es
->
hwndSelf
;
TRACE
(
"notification %d sent to %p.
\n
"
,
code
,
es
->
hwndParent
);
SendMessageW
(
es
->
hwndParent
,
WM_COMMAND
,
MAKEWPARAM
(
GetWindowLongPtrW
(
es
->
hwndSelf
,
GWLP_ID
),
code
),
(
LPARAM
)
es
->
hwndSelf
);
return
IsWindow
(
hwnd
);
}
static
LRESULT
EDIT_EM_PosFromChar
(
EDITSTATE
*
es
,
INT
index
,
BOOL
after_wrap
);
...
...
@@ -1275,7 +1273,7 @@ static BOOL EDIT_MakeFit(EDITSTATE *es, UINT size)
if
(
es
->
buffer_size
<
size
)
{
WARN
(
"FAILED ! We now have %d+1
\n
"
,
es
->
buffer_size
);
EDIT_NOTIFY_PARENT
(
es
,
EN_ERRSPACE
);
notify_parent
(
es
,
EN_ERRSPACE
);
return
FALSE
;
}
else
{
TRACE
(
"We now have %d+1
\n
"
,
es
->
buffer_size
);
...
...
@@ -1322,7 +1320,7 @@ static void EDIT_UpdateTextRegion(EDITSTATE *es, HRGN hrgn, BOOL bErase)
{
if
(
es
->
flags
&
EF_UPDATE
)
{
es
->
flags
&=
~
EF_UPDATE
;
EDIT_NOTIFY_PARENT
(
es
,
EN_UPDATE
)
;
if
(
!
notify_parent
(
es
,
EN_UPDATE
))
return
;
}
InvalidateRgn
(
es
->
hwndSelf
,
hrgn
,
bErase
);
}
...
...
@@ -1337,7 +1335,7 @@ static void EDIT_UpdateText(EDITSTATE *es, const RECT *rc, BOOL bErase)
{
if
(
es
->
flags
&
EF_UPDATE
)
{
es
->
flags
&=
~
EF_UPDATE
;
EDIT_NOTIFY_PARENT
(
es
,
EN_UPDATE
)
;
if
(
!
notify_parent
(
es
,
EN_UPDATE
))
return
;
}
InvalidateRect
(
es
->
hwndSelf
,
rc
,
bErase
);
}
...
...
@@ -1622,9 +1620,9 @@ static BOOL EDIT_EM_LineScroll_internal(EDITSTATE *es, INT dx, INT dy)
EDIT_UpdateScrollInfo
(
es
);
}
if
(
dx
&&
!
(
es
->
flags
&
EF_HSCROLL_TRACK
))
EDIT_NOTIFY_PARENT
(
es
,
EN_HSCROLL
);
notify_parent
(
es
,
EN_HSCROLL
);
if
(
dy
&&
!
(
es
->
flags
&
EF_VSCROLL_TRACK
))
EDIT_NOTIFY_PARENT
(
es
,
EN_VSCROLL
);
notify_parent
(
es
,
EN_VSCROLL
);
return
TRUE
;
}
...
...
@@ -2456,8 +2454,9 @@ static void EDIT_EM_ReplaceSel(EDITSTATE *es, BOOL can_undo, const WCHAR *lpsz_r
/* Issue the EN_MAXTEXT notification and continue with replacing text
* so that buffer limit is honored. */
if
((
honor_limit
)
&&
(
size
>
es
->
buffer_limit
))
{
EDIT_NOTIFY_PARENT
(
es
,
EN_MAXTEXT
);
if
((
honor_limit
)
&&
(
size
>
es
->
buffer_limit
))
{
if
(
!
notify_parent
(
es
,
EN_MAXTEXT
))
return
;
/* Buffer limit can be smaller than the actual length of text in combobox */
if
(
es
->
buffer_limit
<
(
tl
-
(
e
-
s
)))
strl
=
0
;
...
...
@@ -2515,7 +2514,7 @@ static void EDIT_EM_ReplaceSel(EDITSTATE *es, BOOL can_undo, const WCHAR *lpsz_r
strl
=
0
;
e
=
s
;
SetRectRgn
(
hrgn
,
0
,
0
,
0
,
0
);
EDIT_NOTIFY_PARENT
(
es
,
EN_MAXTEXT
)
;
if
(
!
notify_parent
(
es
,
EN_MAXTEXT
))
return
;
}
}
else
{
...
...
@@ -2532,7 +2531,7 @@ static void EDIT_EM_ReplaceSel(EDITSTATE *es, BOOL can_undo, const WCHAR *lpsz_r
EDIT_CalcLineWidth_SL
(
es
);
}
text_buffer_changed
(
es
);
EDIT_NOTIFY_PARENT
(
es
,
EN_MAXTEXT
)
;
if
(
!
notify_parent
(
es
,
EN_MAXTEXT
))
return
;
}
}
...
...
@@ -2623,7 +2622,7 @@ static void EDIT_EM_ReplaceSel(EDITSTATE *es, BOOL can_undo, const WCHAR *lpsz_r
if
(
send_update
||
(
es
->
flags
&
EF_UPDATE
))
{
es
->
flags
&=
~
EF_UPDATE
;
EDIT_NOTIFY_PARENT
(
es
,
EN_CHANGE
)
;
if
(
!
notify_parent
(
es
,
EN_CHANGE
))
return
;
}
EDIT_InvalidateUniscribeData
(
es
);
}
...
...
@@ -2891,7 +2890,7 @@ static BOOL EDIT_EM_Undo(EDITSTATE *es)
EDIT_EM_ReplaceSel
(
es
,
TRUE
,
utext
,
ulength
,
TRUE
,
TRUE
);
EDIT_EM_SetSel
(
es
,
es
->
undo_position
,
es
->
undo_position
+
es
->
undo_insert_count
,
FALSE
);
/* send the notification after the selection start and end are set */
EDIT_NOTIFY_PARENT
(
es
,
EN_CHANGE
)
;
if
(
!
notify_parent
(
es
,
EN_CHANGE
))
return
TRUE
;
EDIT_EM_ScrollCaret
(
es
);
heap_free
(
utext
);
...
...
@@ -3385,8 +3384,8 @@ static LRESULT EDIT_WM_KeyDown(EDITSTATE *es, INT key)
{
if
(
EDIT_EM_SetSel
(
es
,
0
,
get_text_length
(
es
),
FALSE
))
{
EDIT_NOTIFY_PARENT
(
es
,
EN_UPDATE
)
;
EDIT_NOTIFY_PARENT
(
es
,
EN_CHANGE
);
if
(
!
notify_parent
(
es
,
EN_UPDATE
))
break
;
notify_parent
(
es
,
EN_CHANGE
);
}
}
break
;
...
...
@@ -3408,7 +3407,7 @@ static LRESULT EDIT_WM_KillFocus(HTHEME theme, EDITSTATE *es)
DestroyCaret
();
if
(
!
(
es
->
style
&
ES_NOHIDESEL
))
EDIT_InvalidateText
(
es
,
es
->
selection_start
,
es
->
selection_end
);
EDIT_NOTIFY_PARENT
(
es
,
EN_KILLFOCUS
)
;
if
(
!
notify_parent
(
es
,
EN_KILLFOCUS
))
return
0
;
/* Throw away left over scroll when we lose focus */
es
->
wheelDeltaRemainder
=
0
;
...
...
@@ -3694,7 +3693,7 @@ static void EDIT_WM_SetFocus(HTHEME theme, EDITSTATE *es)
CreateCaret
(
es
->
hwndSelf
,
0
,
1
,
es
->
line_height
);
EDIT_SetCaretPos
(
es
,
es
->
selection_end
,
es
->
flags
&
EF_AFTER_WRAP
);
ShowCaret
(
es
->
hwndSelf
);
EDIT_NOTIFY_PARENT
(
es
,
EN_SETFOCUS
)
;
if
(
!
notify_parent
(
es
,
EN_SETFOCUS
))
return
;
if
(
theme
)
flags
|=
RDW_FRAME
|
RDW_ERASE
;
...
...
@@ -3820,8 +3819,8 @@ static void EDIT_WM_SetText(EDITSTATE *es, LPCWSTR text)
*/
if
(
!
((
es
->
style
&
ES_MULTILINE
)
||
es
->
hwndListBox
))
{
EDIT_NOTIFY_PARENT
(
es
,
EN_UPDATE
)
;
EDIT_NOTIFY_PARENT
(
es
,
EN_CHANGE
)
;
if
(
!
notify_parent
(
es
,
EN_UPDATE
))
return
;
if
(
!
notify_parent
(
es
,
EN_CHANGE
))
return
;
}
EDIT_EM_ScrollCaret
(
es
);
EDIT_UpdateScrollInfo
(
es
);
...
...
@@ -4022,7 +4021,7 @@ static LRESULT EDIT_WM_HScroll(EDITSTATE *es, INT action, INT pos)
if
(
!
dx
)
{
/* force scroll info update */
EDIT_UpdateScrollInfo
(
es
);
EDIT_NOTIFY_PARENT
(
es
,
EN_HSCROLL
);
notify_parent
(
es
,
EN_HSCROLL
);
}
break
;
case
SB_ENDSCROLL
:
...
...
@@ -4145,7 +4144,7 @@ static LRESULT EDIT_WM_VScroll(EDITSTATE *es, INT action, INT pos)
{
/* force scroll info update */
EDIT_UpdateScrollInfo
(
es
);
EDIT_NOTIFY_PARENT
(
es
,
EN_VSCROLL
);
notify_parent
(
es
,
EN_VSCROLL
);
}
break
;
case
SB_ENDSCROLL
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment