From 86b17d6aaedd2ae09b5758f12a9c9c999e51ce77 Mon Sep 17 00:00:00 2001 From: marc_culler Date: Wed, 14 Sep 2022 16:27:28 +0000 Subject: Apply patch from Christopher Chavez to avoid use-after-free crashes. --- macosx/tkMacOSXInit.c | 33 +++++++++++++++++++++++++++++++++ macosx/tkMacOSXPrivate.h | 6 +++--- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/macosx/tkMacOSXInit.c b/macosx/tkMacOSXInit.c index bf5b6de..a9b459a 100644 --- a/macosx/tkMacOSXInit.c +++ b/macosx/tkMacOSXInit.c @@ -45,8 +45,41 @@ static int TkMacOSXGetAppPathCmd(ClientData cd, Tcl_Interp *ip, @synthesize needsToDraw = _needsToDraw; @synthesize tkLiveResizeEnded = _tkLiveResizeEnded; @synthesize tkPointerWindow = _tkPointerWindow; +- (void) setTkPointerWindow: (TkWindow *)winPtr +{ + if (_tkPointerWindow) { + Tcl_Release(_tkPointerWindow); + } + if (winPtr) { + Tcl_Preserve(winPtr); + } + _tkPointerWindow = winPtr; + return; +} @synthesize tkEventTarget = _tkEventTarget; +- (void) setTkEventTarget: (TkWindow *)winPtr +{ + if (_tkEventTarget) { + Tcl_Release(_tkEventTarget); + } + if (winPtr) { + Tcl_Preserve(winPtr); + } + _tkEventTarget = winPtr; + return; +} @synthesize tkDragTarget = _tkDragTarget; +- (void) setTkDragTarget: (TkWindow *)winPtr +{ + if (_tkDragTarget) { + Tcl_Release(_tkDragTarget); + } + if (winPtr) { + Tcl_Preserve(winPtr); + } + _tkDragTarget = winPtr; + return; +} @synthesize tkButtonState = _tkButtonState; @end diff --git a/macosx/tkMacOSXPrivate.h b/macosx/tkMacOSXPrivate.h index 3b03139..7ebdbc8 100644 --- a/macosx/tkMacOSXPrivate.h +++ b/macosx/tkMacOSXPrivate.h @@ -351,9 +351,9 @@ VISIBILITY_HIDDEN * Persistent state variables used by processMouseEvent. */ -@property TkWindow *tkPointerWindow; -@property TkWindow *tkEventTarget; -@property TkWindow *tkDragTarget; +@property(nonatomic) TkWindow *tkPointerWindow; +@property(nonatomic) TkWindow *tkEventTarget; +@property(nonatomic) TkWindow *tkDragTarget; @property unsigned int tkButtonState; @end -- cgit v0.12