diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 1996-10-01 10:46:46 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 1996-10-01 10:46:46 (GMT) |
commit | cfb60ee1e88118ca50254cf073b934a136e9f96a (patch) | |
tree | 7f70825383edcad46001fdd5c63fe9265f69a57c /Mac | |
parent | cc778ebd62a5e256c6cf44b32f417658cce1751c (diff) | |
download | cpython-cfb60ee1e88118ca50254cf073b934a136e9f96a.zip cpython-cfb60ee1e88118ca50254cf073b934a136e9f96a.tar.gz cpython-cfb60ee1e88118ca50254cf073b934a136e9f96a.tar.bz2 |
Fixed very nasty null-dereferencing bug in DisposeControl/destroy
object.
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/ctl/Ctlmodule.c | 55 | ||||
-rw-r--r-- | Mac/Modules/ctl/ctledit.py | 18 | ||||
-rw-r--r-- | Mac/Modules/ctl/ctlscan.py | 2 | ||||
-rw-r--r-- | Mac/Modules/ctl/ctlsupport.py | 2 |
4 files changed, 42 insertions, 35 deletions
diff --git a/Mac/Modules/ctl/Ctlmodule.c b/Mac/Modules/ctl/Ctlmodule.c index 629d3fb..526338b 100644 --- a/Mac/Modules/ctl/Ctlmodule.c +++ b/Mac/Modules/ctl/Ctlmodule.c @@ -92,23 +92,10 @@ CtlObj_Convert(v, p_itself) static void CtlObj_dealloc(self) ControlObject *self; { - SetCRefCon(self->ob_itself, (long)0); /* Make it forget about us */ + if (self->ob_itself) SetCRefCon(self->ob_itself, (long)0); /* Make it forget about us */ PyMem_DEL(self); } -static PyObject *CtlObj_DisposeControl(_self, _args) - ControlObject *_self; - PyObject *_args; -{ - PyObject *_res = NULL; - if (!PyArg_ParseTuple(_args, "")) - return NULL; - DisposeControl(_self->ob_itself); - Py_INCREF(Py_None); - _res = Py_None; - return _res; -} - static PyObject *CtlObj_ShowControl(_self, _args) ControlObject *_self; PyObject *_args; @@ -452,9 +439,26 @@ static PyObject *CtlObj_as_Resource(_self, _args) } +static PyObject *CtlObj_DisposeControl(_self, _args) + ControlObject *_self; + PyObject *_args; +{ + PyObject *_res = NULL; + + if (!PyArg_ParseTuple(_args, "")) + return NULL; + if ( _self->ob_itself ) { + SetCRefCon(_self->ob_itself, (long)0); /* Make it forget about us */ + DisposeControl(_self->ob_itself); + _self->ob_itself = NULL; + } + Py_INCREF(Py_None); + _res = Py_None; + return _res; + +} + static PyMethodDef CtlObj_methods[] = { - {"DisposeControl", (PyCFunction)CtlObj_DisposeControl, 1, - "() -> None"}, {"ShowControl", (PyCFunction)CtlObj_ShowControl, 1, "() -> None"}, {"HideControl", (PyCFunction)CtlObj_HideControl, 1, @@ -499,6 +503,8 @@ static PyMethodDef CtlObj_methods[] = { "() -> (SInt32 _rv)"}, {"as_Resource", (PyCFunction)CtlObj_as_Resource, 1, "Return this Control as a Resource"}, + {"DisposeControl", (PyCFunction)CtlObj_DisposeControl, 1, + "() -> None"}, {NULL, NULL, 0} }; @@ -588,21 +594,6 @@ static PyObject *Ctl_GetNewControl(_self, _args) return _res; } -static PyObject *Ctl_KillControls(_self, _args) - PyObject *_self; - PyObject *_args; -{ - PyObject *_res = NULL; - WindowPtr theWindow; - if (!PyArg_ParseTuple(_args, "O&", - WinObj_Convert, &theWindow)) - return NULL; - KillControls(theWindow); - Py_INCREF(Py_None); - _res = Py_None; - return _res; -} - static PyObject *Ctl_DrawControls(_self, _args) PyObject *_self; PyObject *_args; @@ -663,8 +654,6 @@ static PyMethodDef Ctl_methods[] = { "(WindowPtr theWindow, Rect boundsRect, Str255 title, Boolean visible, SInt16 value, SInt16 min, SInt16 max, SInt16 procID, SInt32 refCon) -> (ControlHandle _rv)"}, {"GetNewControl", (PyCFunction)Ctl_GetNewControl, 1, "(SInt16 controlID, WindowPtr owner) -> (ControlHandle _rv)"}, - {"KillControls", (PyCFunction)Ctl_KillControls, 1, - "(WindowPtr theWindow) -> None"}, {"DrawControls", (PyCFunction)Ctl_DrawControls, 1, "(WindowPtr theWindow) -> None"}, {"UpdateControls", (PyCFunction)Ctl_UpdateControls, 1, diff --git a/Mac/Modules/ctl/ctledit.py b/Mac/Modules/ctl/ctledit.py index d877012..9240851 100644 --- a/Mac/Modules/ctl/ctledit.py +++ b/Mac/Modules/ctl/ctledit.py @@ -6,3 +6,21 @@ f = ManualGenerator("as_Resource", as_resource_body) f.docstring = lambda : "Return this Control as a Resource" methods.append(f) + +DisposeControl_body = """ + if (!PyArg_ParseTuple(_args, "")) + return NULL; + if ( _self->ob_itself ) { + SetCRefCon(_self->ob_itself, (long)0); /* Make it forget about us */ + DisposeControl(_self->ob_itself); + _self->ob_itself = NULL; + } + Py_INCREF(Py_None); + _res = Py_None; + return _res; +""" + +f = ManualGenerator("DisposeControl", DisposeControl_body) +f.docstring = lambda : "() -> None" + +methods.append(f) diff --git a/Mac/Modules/ctl/ctlscan.py b/Mac/Modules/ctl/ctlscan.py index 661cbfe..d3e185e 100644 --- a/Mac/Modules/ctl/ctlscan.py +++ b/Mac/Modules/ctl/ctlscan.py @@ -30,7 +30,7 @@ class MyScanner(Scanner): def makeblacklistnames(self): return [ - 'DisposeControl' # Implied by deletion of control object + 'DisposeControl', # Generated manually 'KillControls', # Implied by close of dialog 'SetCtlAction', ] diff --git a/Mac/Modules/ctl/ctlsupport.py b/Mac/Modules/ctl/ctlsupport.py index cef9f8a..3b32164 100644 --- a/Mac/Modules/ctl/ctlsupport.py +++ b/Mac/Modules/ctl/ctlsupport.py @@ -69,7 +69,7 @@ class MyObjectDefinition(GlobalObjectDefinition): GlobalObjectDefinition.outputInitStructMembers(self) Output("SetCRefCon(itself, (long)it);") def outputCleanupStructMembers(self): - Output("SetCRefCon(self->ob_itself, (long)0); /* Make it forget about us */") + Output("if (self->ob_itself) SetCRefCon(self->ob_itself, (long)0); /* Make it forget about us */") # Create the generator groups and link them module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) |