]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #25659: Change assert to TypeError in from_buffer/_copy()
authorMartin Panter <vadmium+py@gmail.com>
Sun, 20 Nov 2016 07:58:35 +0000 (07:58 +0000)
committerMartin Panter <vadmium+py@gmail.com>
Sun, 20 Nov 2016 07:58:35 +0000 (07:58 +0000)
Based on suggestion by Eryk Sun.

Lib/ctypes/test/test_frombuffer.py
Misc/NEWS
Modules/_ctypes/_ctypes.c

index 29c5a19328c98ba2154dab805e972e105db68bd6..7ab38f1b031f1f5851b9d731d15cc56fe70b93bc 100644 (file)
@@ -120,5 +120,13 @@ class Test(unittest.TestCase):
         with self.assertRaises(ValueError):
             (c_int * 1).from_buffer_copy(a, 16 * sizeof(c_int))
 
+    def test_abstract(self):
+        self.assertRaises(TypeError, Array.from_buffer, bytearray(10))
+        self.assertRaises(TypeError, Structure.from_buffer, bytearray(10))
+        self.assertRaises(TypeError, Union.from_buffer, bytearray(10))
+        self.assertRaises(TypeError, Array.from_buffer_copy, b"123")
+        self.assertRaises(TypeError, Structure.from_buffer_copy, b"123")
+        self.assertRaises(TypeError, Union.from_buffer_copy, b"123")
+
 if __name__ == '__main__':
     unittest.main()
index 07576b5ef11c604233a278e94be421562d7d25de..785f3616e16e6404bbbe97ef044b1f048f6c1abf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -121,6 +121,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #25659: In ctypes, prevent a crash calling the from_buffer() and
+  from_buffer_copy() methods on abstract classes like Array.
+
 - Issue #28732: Fix crash in os.spawnv() with no elements in args
 
 - Issue #28485: Always raise ValueError for negative
index 2f3495e40b0c699f42522c7116323cab9cb140bf..b32a0ce9e81b4d464b95943b1181da9c271897ff 100644 (file)
@@ -469,7 +469,10 @@ CDataType_from_buffer(PyObject *type, PyObject *args)
     Py_ssize_t offset = 0;
 
     StgDictObject *dict = PyType_stgdict(type);
-    assert (dict);
+    if (!dict) {
+        PyErr_SetString(PyExc_TypeError, "abstract class");
+        return NULL;
+    }
 
     if (!PyArg_ParseTuple(args, "O|n:from_buffer", &obj, &offset))
         return NULL;
@@ -537,9 +540,12 @@ CDataType_from_buffer_copy(PyObject *type, PyObject *args)
     Py_ssize_t offset = 0;
     PyObject *result;
     StgDictObject *dict = PyType_stgdict(type);
-    assert (dict);
+    if (!dict) {
+        PyErr_SetString(PyExc_TypeError, "abstract class");
+        return NULL;
+    }
 
-    if (!PyArg_ParseTuple(args, "y*|n:from_buffer", &buffer, &offset))
+    if (!PyArg_ParseTuple(args, "y*|n:from_buffer_copy", &buffer, &offset))
         return NULL;
 
     if (offset < 0) {