]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fixed very nasty null-dereferencing bug in DisposeControl/destroy
authorJack Jansen <jack.jansen@cwi.nl>
Tue, 1 Oct 1996 10:46:46 +0000 (10:46 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Tue, 1 Oct 1996 10:46:46 +0000 (10:46 +0000)
object.

Mac/Modules/ctl/Ctlmodule.c
Mac/Modules/ctl/ctledit.py
Mac/Modules/ctl/ctlscan.py
Mac/Modules/ctl/ctlsupport.py

index 629d3fb3823888447889ec2892258938d34940d4..526338bf84a1ef39b05cc39738cc9b75535bb87b 100644 (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,
index d8770122d8cebb22c8c7f34c76cc96d233ec62ec..9240851bb4e509aea9c6069162f0a007621196fe 100644 (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)
index 661cbfebc2b92ecc3531c8eeb0f78ba1b4132875..d3e185ec259d059edd0e13400f9fa78c9a5a0813 100644 (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',
                        ]
index cef9f8a40b57f5185a9c48691997354c7e430adb..3b32164883181b918d576c409f77f89ae00e245f 100644 (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)