Fixed very nasty null-dereferencing bug in DisposeControl/destroy

object.
This commit is contained in:
Jack Jansen 1996-10-01 10:46:46 +00:00
parent cc778ebd62
commit cfb60ee1e8
4 changed files with 42 additions and 35 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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',
]

View File

@ -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)