summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2007-12-18 19:00:34 (GMT)
committerThomas Heller <theller@ctypes.org>2007-12-18 19:00:34 (GMT)
commit153038efa4fa1b2e9819703abf22bddf76a62e9f (patch)
tree0585ce11abee572dd91570a124764ae9d84a7cfb
parenteffde12f5fe41bab9c27269bd77237200d953afd (diff)
downloadcpython-153038efa4fa1b2e9819703abf22bddf76a62e9f.zip
cpython-153038efa4fa1b2e9819703abf22bddf76a62e9f.tar.gz
cpython-153038efa4fa1b2e9819703abf22bddf76a62e9f.tar.bz2
Issue #1642: Fix segfault in ctypes when trying to delete attributes.
-rw-r--r--Lib/ctypes/test/test_delattr.py21
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/_ctypes/_ctypes.c16
-rw-r--r--Modules/_ctypes/cfield.c5
4 files changed, 44 insertions, 0 deletions
diff --git a/Lib/ctypes/test/test_delattr.py b/Lib/ctypes/test/test_delattr.py
new file mode 100644
index 0000000..0f4d586
--- /dev/null
+++ b/Lib/ctypes/test/test_delattr.py
@@ -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()
diff --git a/Misc/NEWS b/Misc/NEWS
index a45ac11..1599ade 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -325,6 +325,8 @@ Core and builtins
Library
-------
+- Issue #1642: Fix segfault in ctypes when trying to delete attributes.
+
- Issue #1727780: Support loading pickles of random.Random objects created
on 32-bit systems on 64-bit systems, and vice versa. As a consequence
of the change, Random pickles created by Python 2.6 cannot be loaded
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index d564fb9..03e2e7a 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -788,6 +788,12 @@ CharArray_set_value(CDataObject *self, PyObject *value)
char *ptr;
Py_ssize_t 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,
@@ -843,6 +849,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
{
Py_ssize_t 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,
@@ -4139,6 +4150,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);
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index 77667f5..8857e44 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -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);
}