]> granicus.if.org Git - python/commitdiff
Issue #1642: Fix segfault in ctypes when trying to delete attributes.
authorThomas Heller <theller@ctypes.org>
Tue, 18 Dec 2007 19:00:59 +0000 (19:00 +0000)
committerThomas Heller <theller@ctypes.org>
Tue, 18 Dec 2007 19:00:59 +0000 (19:00 +0000)
Lib/ctypes/test/test_delattr.py [new file with mode: 0644]
Misc/NEWS
Modules/_ctypes/_ctypes.c
Modules/_ctypes/cfield.c

diff --git a/Lib/ctypes/test/test_delattr.py b/Lib/ctypes/test/test_delattr.py
new file mode 100644 (file)
index 0000000..0f4d586
--- /dev/null
@@ -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()
index c87c3c8c0d67824ca0f51d6a384c86ea397692d5..0b24d7f991bd530e544a24401921d20491246a3f 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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
index 4dd35c233f8d57d3ec4047f76b08545b58a9bd7e..fa0552c6eeec5634b0f487f6f4c55a7fbf0a18ec 100644 (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);
index 8cb1f19343765ebfb2ff9eb94d6d3bcb3cd90e2b..0fd82bc02fbbc7bf809509a0a1a73cc951b855df 100644 (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);
 }