python/dist/src/Objects funcobject.c,2.66,2.67
Update of /cvsroot/python/python/dist/src/Objects In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19812/Objects Modified Files: funcobject.c Log Message: Wrote down the invariants of some common objects whose structure is exposed in header files. Fixed a few comments in these headers. As we might have expected, writing down invariants systematically exposed a (minor) bug. In this case, function objects have a writeable func_code attribute, which could be set to code objects with the wrong number of free variables. Calling the resulting function segfaulted the interpreter. Added a corresponding test. Index: funcobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/funcobject.c,v retrieving revision 2.66 retrieving revision 2.67 diff -u -d -r2.66 -r2.67 --- funcobject.c 12 Aug 2004 18:12:44 -0000 2.66 +++ funcobject.c 28 Oct 2004 16:32:00 -0000 2.67 @@ -230,6 +230,7 @@ func_set_code(PyFunctionObject *op, PyObject *value) { PyObject *tmp; + int nfree, nclosure; if (restricted()) return -1; @@ -240,6 +241,17 @@ "func_code must be set to a code object"); return -1; } + nfree = PyCode_GetNumFree((PyCodeObject *)value); + nclosure = (op->func_closure == NULL ? 0 : + PyTuple_GET_SIZE(op->func_closure)); + if (nclosure != nfree) { + PyErr_Format(PyExc_ValueError, + "%s() requires a code object with %d free vars," + " not %d", + PyString_AsString(op->func_name), + nclosure, nfree); + return -1; + } tmp = op->func_code; Py_INCREF(value); op->func_code = value;
participants (1)
-
arigoļ¼ users.sourceforge.net