]> granicus.if.org Git - python/commitdiff
Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 30 Aug 2011 19:04:35 +0000 (21:04 +0200)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Tue, 30 Aug 2011 19:04:35 +0000 (21:04 +0200)
some functions like file.write().

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

index bf931abc6a5d072f07971dd8840f18d0c6d094e5..12945ed9807cc57bd0ed46d5a1d9178d3a356086 100644 (file)
@@ -20,6 +20,10 @@ class StringBufferTestCase(unittest.TestCase):
         self.assertEqual(b[::2], "ac")
         self.assertEqual(b[::5], "a")
 
+    def test_buffer_interface(self):
+        self.assertEqual(len(bytearray(create_string_buffer(0))), 0)
+        self.assertEqual(len(bytearray(create_string_buffer(1))), 1)
+
     def test_string_conversion(self):
         b = create_string_buffer(u"abc")
         self.assertEqual(len(b), 4) # trailing nul char
index a35c186719777fc6381d29d2ab49f2f881e2096d..8c77c9f91fb88a4aeb2f80472fadd2be200f0ce7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -180,6 +180,9 @@ Library
 Extension Modules
 -----------------
 
+- Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
+  some functions like file.write().
+
 - Issue #10309: Define _GNU_SOURCE so that mremap() gets the proper
   signature.  Without this, architectures where sizeof void* != sizeof int are
   broken.  Patch given by Hallvard B Furuseth.
index c6c6dbda18bf7803eb92e4a14abec2d6a1f80440..c4d08901cd3fb21596aab5c7d1fd62466893b5cc 100644 (file)
@@ -2576,8 +2576,10 @@ static int PyCData_NewGetBuffer(PyObject *_self, Py_buffer *view, int flags)
     view->ndim = dict->ndim;
     view->shape = dict->shape;
     view->itemsize = self->b_size;
-    for (i = 0; i < view->ndim; ++i) {
-        view->itemsize /= dict->shape[i];
+    if (view->itemsize) {
+        for (i = 0; i < view->ndim; ++i) {
+            view->itemsize /= dict->shape[i];
+        }
     }
     view->strides = NULL;
     view->suboffsets = NULL;