mirror of https://github.com/python/cpython
Issue #1642: Fix segfault in ctypes when trying to delete attributes.
This commit is contained in:
parent
effde12f5f
commit
153038efa4
|
@ -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()
|
|
@ -325,6 +325,8 @@ Core and builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #1642: Fix segfault in ctypes when trying to delete attributes.
|
||||||
|
|
||||||
- Issue #1727780: Support loading pickles of random.Random objects created
|
- Issue #1727780: Support loading pickles of random.Random objects created
|
||||||
on 32-bit systems on 64-bit systems, and vice versa. As a consequence
|
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
|
of the change, Random pickles created by Python 2.6 cannot be loaded
|
||||||
|
|
|
@ -788,6 +788,12 @@ CharArray_set_value(CDataObject *self, PyObject *value)
|
||||||
char *ptr;
|
char *ptr;
|
||||||
Py_ssize_t size;
|
Py_ssize_t size;
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"can't delete attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (PyUnicode_Check(value)) {
|
if (PyUnicode_Check(value)) {
|
||||||
value = PyUnicode_AsEncodedString(value,
|
value = PyUnicode_AsEncodedString(value,
|
||||||
conversion_mode_encoding,
|
conversion_mode_encoding,
|
||||||
|
@ -843,6 +849,11 @@ WCharArray_set_value(CDataObject *self, PyObject *value)
|
||||||
{
|
{
|
||||||
Py_ssize_t result = 0;
|
Py_ssize_t result = 0;
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"can't delete attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (PyString_Check(value)) {
|
if (PyString_Check(value)) {
|
||||||
value = PyUnicode_FromEncodedObject(value,
|
value = PyUnicode_FromEncodedObject(value,
|
||||||
conversion_mode_encoding,
|
conversion_mode_encoding,
|
||||||
|
@ -4139,6 +4150,11 @@ Simple_set_value(CDataObject *self, PyObject *value)
|
||||||
PyObject *result;
|
PyObject *result;
|
||||||
StgDictObject *dict = PyObject_stgdict((PyObject *)self);
|
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); /* Cannot be NULL for CDataObject instances */
|
||||||
assert(dict->setfunc);
|
assert(dict->setfunc);
|
||||||
result = dict->setfunc(self->b_ptr, value, dict->size);
|
result = dict->setfunc(self->b_ptr, value, dict->size);
|
||||||
|
|
|
@ -199,6 +199,11 @@ CField_set(CFieldObject *self, PyObject *inst, PyObject *value)
|
||||||
assert(CDataObject_Check(inst));
|
assert(CDataObject_Check(inst));
|
||||||
dst = (CDataObject *)inst;
|
dst = (CDataObject *)inst;
|
||||||
ptr = dst->b_ptr + self->offset;
|
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,
|
return CData_set(inst, self->proto, self->setfunc, value,
|
||||||
self->index, self->size, ptr);
|
self->index, self->size, ptr);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue