From a105cd7edb26c06a22c9cbadc26ae0eaa8cf19c4 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 13 Nov 2014 14:56:31 -0800 Subject: [PATCH 1/2] Test for issue #1008 --- Tests/test_image_putdata.py | 20 ++++++++++++++++++++ Tests/test_numpy.py | 10 ++++++++++ 2 files changed, 30 insertions(+) diff --git a/Tests/test_image_putdata.py b/Tests/test_image_putdata.py index 46a2ace71..3b7dc836a 100644 --- a/Tests/test_image_putdata.py +++ b/Tests/test_image_putdata.py @@ -1,4 +1,5 @@ from helper import unittest, PillowTestCase, hopper +from array import array import sys @@ -63,6 +64,25 @@ class TestImagePutData(PillowTestCase): target = [2.0 * float(elt) + 256.0 for elt in data] self.assertEqual(list(im.getdata()), target) + def test_array_B(self): + # shouldn't segfault + # see https://github.com/python-pillow/Pillow/issues/1008 + + arr = array('B', [0])*15000 + im = Image.new('L', (150, 100)) + im.putdata(arr) + + self.assertEqual(len(im.getdata()),len(arr)) + + def test_array_F(self): + # shouldn't segfault + # see https://github.com/python-pillow/Pillow/issues/1008 + + im = Image.new('F', (150, 100)) + arr = array('f', [0.0])*15000 + im.putdata(arr) + + self.assertEqual(len(im.getdata()),len(arr)) if __name__ == '__main__': unittest.main() diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py index b00b8b36b..7b6f22b2b 100644 --- a/Tests/test_numpy.py +++ b/Tests/test_numpy.py @@ -121,6 +121,16 @@ class TestNumpy(PillowTestCase): im.point(lut) + def test_putdata(self): + # shouldn't segfault + # see https://github.com/python-pillow/Pillow/issues/1008 + + im = Image.new('F', (150, 100)) + arr = numpy.zeros((15000,), numpy.float32) + im.putdata(arr) + + self.assertEqual(len(im.getdata()),len(arr)) + if __name__ == '__main__': unittest.main() From f75c5562c7a6a887bdcb8c7f93022fa1fdfcee09 Mon Sep 17 00:00:00 2001 From: wiredfool Date: Thu, 13 Nov 2014 14:56:59 -0800 Subject: [PATCH 2/2] Fix #1008, Correct argument to PySequence_Fast_GET_ITEM --- _imaging.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_imaging.c b/_imaging.c index f7ea510bc..28ac4600e 100644 --- a/_imaging.c +++ b/_imaging.c @@ -1269,7 +1269,7 @@ _putdata(ImagingObject* self, PyObject* args) if (scale == 1.0 && offset == 0.0) { /* Clipped data */ for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); image->image8[y][x] = (UINT8) CLIP(PyInt_AsLong(op)); if (++x >= (int) image->xsize){ x = 0, y++; @@ -1279,7 +1279,7 @@ _putdata(ImagingObject* self, PyObject* args) } else { /* Scaled and clipped data */ for (i = x = y = 0; i < n; i++) { - PyObject *op = PySequence_Fast_GET_ITEM(data, i); + PyObject *op = PySequence_Fast_GET_ITEM(seq, i); image->image8[y][x] = CLIP( (int) (PyFloat_AsDouble(op) * scale + offset)); if (++x >= (int) image->xsize){ @@ -1299,7 +1299,7 @@ _putdata(ImagingObject* self, PyObject* args) switch (image->type) { case IMAGING_TYPE_INT32: for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); IMAGING_PIXEL_INT32(image, x, y) = (INT32) (PyFloat_AsDouble(op) * scale + offset); if (++x >= (int) image->xsize){ @@ -1310,7 +1310,7 @@ _putdata(ImagingObject* self, PyObject* args) break; case IMAGING_TYPE_FLOAT32: for (i = x = y = 0; i < n; i++) { - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); IMAGING_PIXEL_FLOAT32(image, x, y) = (FLOAT32) (PyFloat_AsDouble(op) * scale + offset); if (++x >= (int) image->xsize){ @@ -1326,7 +1326,7 @@ _putdata(ImagingObject* self, PyObject* args) INT32 inkint; } u; - op = PySequence_Fast_GET_ITEM(data, i); + op = PySequence_Fast_GET_ITEM(seq, i); if (!op || !getink(op, image, u.ink)) { return NULL; }