Issue #1642: Fix segfault in ctypes when trying to delete attributes.

This commit is contained in:
Thomas Heller 2007-12-18 19:00:59 +00:00
parent 52550e593d
commit 8e9e4d8f95
4 changed files with 44 additions and 0 deletions

View File

@ -0,0 +1,21 @@
import unittest
from ctypes import *
class X(Structure):
_fields_ = [("foo", c_int)]
class TestCase(unittest.TestCase):
def test_simple(self):
self.assertRaises(TypeError,
delattr, c_int(42), "value")
def test_chararray(self):
self.assertRaises(TypeError,
delattr, (c_char * 5)(), "value")
def test_struct(self):
self.assertRaises(TypeError,
delattr, X(), "foo")
if __name__ == "__main__":
unittest.main()

View File

@ -49,6 +49,8 @@ Core and builtins
Library
-------
- Issue #1642: Fix segfault in ctypes when trying to delete attributes.
- os.access now returns True on Windows for any existing directory.
- Issue #1531: tarfile.py: Read fileobj from the current offset, do not

View File

@ -791,6 +791,12 @@ CharArray_set_value(CDataObject *self, PyObject *value)
char *ptr;
int size;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
if (PyUnicode_Check(value)) {
value = PyUnicode_AsEncodedString(value,
conversion_mode_encoding,
@ -846,6 +852,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
{
int result = 0;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
if (PyString_Check(value)) {
value = PyUnicode_FromEncodedObject(value,
conversion_mode_encoding,
@ -3969,6 +3980,11 @@ Simple_set_value(CDataObject *self, PyObject *value)
PyObject *result;
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
assert(dict); /* Cannot be NULL for CDataObject instances */
assert(dict->setfunc);
result = dict->setfunc(self->b_ptr, value, dict->size);

View File

@ -199,6 +199,11 @@ CField_set(CFieldObject *self, PyObject *inst, PyObject *value)
assert(CDataObject_Check(inst));
dst = (CDataObject *)inst;
ptr = dst->b_ptr + self->offset;
if (value == NULL) {
PyErr_SetString(PyExc_TypeError,
"can't delete attribute");
return -1;
}
return CData_set(inst, self->proto, self->setfunc, value,
self->index, self->size, ptr);
}