Release date: XX-XXX-2003
============================
+- It is no longer possible to use object.__setattr__ to circumvent the
+ restrictions on setting attributes of type objects.
+
- Implemented os.fsync() for Windows, where it calls the MS _commit()
function. Before, there was no way in core Python to ensure file
writes actually showed up on disk when necessary.
return PyInt_FromLong((long)res);
}
+/* Helper to check for object.__setattr__ or __delattr__ applied to a type.
+ This is called the Carlo Verre hack after its discoverer. */
+static int
+hackcheck(PyObject *self, setattrofunc func, char *what)
+{
+ PyTypeObject *type = self->ob_type;
+ while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE)
+ type = type->tp_base;
+ if (type->tp_setattro != func) {
+ PyErr_Format(PyExc_TypeError,
+ "can't apply this %s to %s object",
+ what,
+ type->tp_name);
+ return 0;
+ }
+ return 1;
+}
+
static PyObject *
wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
{
if (!PyArg_ParseTuple(args, "OO", &name, &value))
return NULL;
+ if (!hackcheck(self, func, "__setattr__"))
+ return NULL;
res = (*func)(self, name, value);
if (res < 0)
return NULL;
if (!PyArg_ParseTuple(args, "O", &name))
return NULL;
+ if (!hackcheck(self, func, "__delattr__"))
+ return NULL;
res = (*func)(self, name, NULL);
if (res < 0)
return NULL;