Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 326e189

Browse files
committed
Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
some functions like file.write().
1 parent caa745e commit 326e189

3 files changed

Lines changed: 11 additions & 2 deletions

File tree

Lib/ctypes/test/test_buffers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ def test_buffer(self):
2020
self.assertEqual(b[::2], b"ac")
2121
self.assertEqual(b[::5], b"a")
2222

23+
def test_buffer_interface(self):
24+
self.assertEqual(len(bytearray(create_string_buffer(0))), 0)
25+
self.assertEqual(len(bytearray(create_string_buffer(1))), 1)
26+
2327
try:
2428
c_wchar
2529
except NameError:

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ Library
185185
Extension Modules
186186
-----------------
187187

188+
- Issue #9651: Fix a crash when ctypes.create_string_buffer(0) was passed to
189+
some functions like file.write().
190+
188191
- Issue #10309: Define _GNU_SOURCE so that mremap() gets the proper
189192
signature. Without this, architectures where sizeof void* != sizeof int are
190193
broken. Patch given by Hallvard B Furuseth.

Modules/_ctypes/_ctypes.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2488,8 +2488,10 @@ static int PyCData_NewGetBuffer(PyObject *_self, Py_buffer *view, int flags)
24882488
view->ndim = dict->ndim;
24892489
view->shape = dict->shape;
24902490
view->itemsize = self->b_size;
2491-
for (i = 0; i < view->ndim; ++i) {
2492-
view->itemsize /= dict->shape[i];
2491+
if (view->itemsize) {
2492+
for (i = 0; i < view->ndim; ++i) {
2493+
view->itemsize /= dict->shape[i];
2494+
}
24932495
}
24942496
view->strides = NULL;
24952497
view->suboffsets = NULL;

0 commit comments

Comments
 (0)