Merge pull request #2419 from hugovk/numpy-zero-size

Fix division by zero when creating 0x0 image from numpy array
This commit is contained in:
wiredfool 2017-02-22 10:06:15 +00:00 committed by GitHub
commit 5544781270
3 changed files with 11 additions and 3 deletions

View File

@ -2036,7 +2036,7 @@ def _check_size(size):
if len(size) != 2:
raise ValueError("Size must be a tuple of length 2")
if size[0] < 0 or size[1] < 0:
raise ValueError("Width and Height must be => 0")
raise ValueError("Width and height must be >= 0")
return True

View File

@ -204,6 +204,14 @@ class TestNumpy(PillowTestCase):
self.assertEqual(len(im.getdata()), len(arr))
def test_zero_size(self):
# Shouldn't cause floating point exception
# See https://github.com/python-pillow/Pillow/issues/2259
im = Image.fromarray(numpy.empty((0, 0), dtype=numpy.uint8))
self.assertEqual(im.size, (0, 0))
if __name__ == '__main__':
unittest.main()

4
map.c
View File

@ -342,7 +342,7 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args)
stride = xsize * 4;
}
if (ysize > INT_MAX / stride) {
if (stride > 0 && ysize > INT_MAX / stride) {
PyErr_SetString(PyExc_MemoryError, "Integer overflow in ysize");
return NULL;
}
@ -352,7 +352,7 @@ PyImaging_MapBuffer(PyObject* self, PyObject* args)
if (offset > PY_SSIZE_T_MAX - size) {
PyErr_SetString(PyExc_MemoryError, "Integer overflow in offset");
return NULL;
}
}
/* check buffer size */
if (PyImaging_GetBuffer(target, &view) < 0)