summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarc_culler <marc.culler@gmail.com>2022-09-20 05:07:01 (GMT)
committermarc_culler <marc.culler@gmail.com>2022-09-20 05:07:01 (GMT)
commit63c9a7bdc6784f26faea47bd01badf0ad1d94d17 (patch)
treeaacf16c8b6f7b69dbdce4c285463e415deb94c59
parent2563fb89e2263bd34cc5d23ad7e7ba45916cc898 (diff)
parent86b17d6aaedd2ae09b5758f12a9c9c999e51ce77 (diff)
downloadtk-63c9a7bdc6784f26faea47bd01badf0ad1d94d17.zip
tk-63c9a7bdc6784f26faea47bd01badf0ad1d94d17.tar.gz
tk-63c9a7bdc6784f26faea47bd01badf0ad1d94d17.tar.bz2
patch [ab95811e07] from Christopher Chavez: prevent use-after-free crashes
-rw-r--r--macosx/tkMacOSXInit.c33
-rw-r--r--macosx/tkMacOSXPrivate.h6
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 62523b8..bc6b49c 100644
--- a/macosx/tkMacOSXPrivate.h
+++ b/macosx/tkMacOSXPrivate.h
@@ -356,9 +356,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