@@ -194,18 +194,18 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
194
194
195
195
switch (channels) {
196
196
case 1 :
197
- png_color_type = PNG_COLOR_TYPE_GRAY;
198
- break ;
197
+ png_color_type = PNG_COLOR_TYPE_GRAY;
198
+ break ;
199
199
case 3 :
200
- png_color_type = PNG_COLOR_TYPE_RGB;
201
- break ;
200
+ png_color_type = PNG_COLOR_TYPE_RGB;
201
+ break ;
202
202
case 4 :
203
- png_color_type = PNG_COLOR_TYPE_RGB_ALPHA;
204
- break ;
203
+ png_color_type = PNG_COLOR_TYPE_RGB_ALPHA;
204
+ break ;
205
205
default :
206
206
PyErr_SetString (PyExc_ValueError,
207
- " Buffer must be an NxMxD array with D in 1, 3, 4 "
208
- " (grayscale, RGB, RGBA)" );
207
+ " Buffer must be an NxMxD array with D in 1, 3, 4 "
208
+ " (grayscale, RGB, RGBA)" );
209
209
goto exit ;
210
210
}
211
211
@@ -349,20 +349,20 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
349
349
sig_bit.alpha = 0 ;
350
350
switch (png_color_type) {
351
351
case PNG_COLOR_TYPE_GRAY:
352
- sig_bit.gray = 8 ;
353
- sig_bit.red = 0 ;
354
- sig_bit.green = 0 ;
355
- sig_bit.blue = 0 ;
356
- break ;
352
+ sig_bit.gray = 8 ;
353
+ sig_bit.red = 0 ;
354
+ sig_bit.green = 0 ;
355
+ sig_bit.blue = 0 ;
356
+ break ;
357
357
case PNG_COLOR_TYPE_RGB_ALPHA:
358
- sig_bit.alpha = 8 ;
359
- // fall through
358
+ sig_bit.alpha = 8 ;
359
+ // fall through
360
360
case PNG_COLOR_TYPE_RGB:
361
- sig_bit.gray = 0 ;
362
- sig_bit.red = 8 ;
363
- sig_bit.green = 8 ;
364
- sig_bit.blue = 8 ;
365
- break ;
361
+ sig_bit.gray = 0 ;
362
+ sig_bit.red = 8 ;
363
+ sig_bit.green = 8 ;
364
+ sig_bit.blue = 8 ;
365
+ break ;
366
366
default :
367
367
PyErr_SetString (PyExc_RuntimeError, " internal error, bad png_color_type" );
368
368
goto exit ;
@@ -408,13 +408,21 @@ static void _read_png_data(PyObject *py_file_obj, png_bytep data, png_size_t len
408
408
Py_ssize_t bufflen;
409
409
if (read_method) {
410
410
result = PyObject_CallFunction (read_method, (char *)" i" , length);
411
- if (PyBytes_AsStringAndSize (result, &buffer, &bufflen) == 0 ) {
412
- if (bufflen == (Py_ssize_t)length) {
413
- memcpy (data, buffer, length);
411
+ if (result) {
412
+ if (PyBytes_AsStringAndSize (result, &buffer, &bufflen) == 0 ) {
413
+ if (bufflen == (Py_ssize_t)length) {
414
+ memcpy (data, buffer, length);
415
+ } else {
416
+ PyErr_SetString (PyExc_IOError, " read past end of file" );
417
+ }
414
418
} else {
415
- PyErr_SetString (PyExc_IOError, " read past end of file " );
419
+ PyErr_SetString (PyExc_IOError, " failed to copy buffer " );
416
420
}
421
+ } else {
422
+ PyErr_SetString (PyExc_IOError, " failed to read file" );
417
423
}
424
+
425
+
418
426
}
419
427
Py_XDECREF (read_method);
420
428
Py_XDECREF (result);
@@ -424,6 +432,10 @@ static void read_png_data(png_structp png_ptr, png_bytep data, png_size_t length
424
432
{
425
433
PyObject *py_file_obj = (PyObject *)png_get_io_ptr (png_ptr);
426
434
_read_png_data (py_file_obj, data, length);
435
+ if (PyErr_Occurred ()) {
436
+ png_error (png_ptr, " failed to read file" );
437
+ }
438
+
427
439
}
428
440
429
441
static PyObject *_read_png (PyObject *filein, bool float_result)
@@ -481,6 +493,9 @@ static PyObject *_read_png(PyObject *filein, bool float_result)
481
493
}
482
494
Py_XDECREF (read_method);
483
495
_read_png_data (py_file, header, 8 );
496
+ if (PyErr_Occurred ()) {
497
+ goto exit ;
498
+ }
484
499
}
485
500
486
501
if (png_sig_cmp (header, 0 , 8 )) {
@@ -503,7 +518,9 @@ static PyObject *_read_png(PyObject *filein, bool float_result)
503
518
}
504
519
505
520
if (setjmp (png_jmpbuf (png_ptr))) {
506
- PyErr_SetString (PyExc_RuntimeError, " Error setting jump" );
521
+ if (!PyErr_Occurred ()) {
522
+ PyErr_SetString (PyExc_RuntimeError, " error setting jump" );
523
+ }
507
524
goto exit ;
508
525
}
509
526
0 commit comments