[Django] #24544: core.files.images.get_image_dimensions broken on some valid PNG images

6 views
Skip to first unread message

Django

unread,
Mar 27, 2015, 5:36:41 AM3/27/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
--------------------------------------+--------------------
Reporter: artscoop | Owner: nobody
Type: Uncategorized | Status: new
Component: File uploads/storage | Version: 1.7
Severity: Normal | Keywords: PIL
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
--------------------------------------+--------------------
Hi,
second time I find a bug in the same function. Here, the function failed
(exception raised and not caught) on a valid PNG file (this image:
https://mega.co.nz/#!W0tXzBAK!iLprbqkVWFAzfcn2GUDRGHiH8Pxyi4DxCQi580shcec).
The error raised by PIL is a `struct.error`, which should be expected but
is not caught by the chunk feeder loop.

The feeder knows this

{{{
except zlib.error as e:
# ignore zlib complaining on truncated stream, just feed
more
# data to parser (ticket #19457).
if e.args[0].startswith("Error -5"):
pass
else:
raise
}}}

but does not know this

{{{
from struct import error
...

except struct.error:
pass
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/24544>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Mar 27, 2015, 5:37:30 AM3/27/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
----------------------------------+----------------------------

Reporter: artscoop | Owner: nobody
Type: Uncategorized | Status: new
Component: File uploads/storage | Version: 1.7
Severity: Normal | Resolution:

Keywords: PIL | Triage Stage: Unreviewed
Has patch: 0 | Easy pickings: 0
UI/UX: 0 |
----------------------------------+----------------------------
Changes (by artscoop):

* Attachment "b.png" added.

Valid but faulty image

Django

unread,
Mar 27, 2015, 5:43:20 AM3/27/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
-------------------------------------+-------------------------------------

Reporter: artscoop | Owner: nobody
Type: Uncategorized | Status: new
Component: File | Version: 1.7
uploads/storage |
Severity: Normal | Resolution:

Keywords: PIL | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by artscoop):

* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0


Old description:

> Hi,
> second time I find a bug in the same function. Here, the function failed
> (exception raised and not caught) on a valid PNG file (this image:
> https://mega.co.nz/#!W0tXzBAK!iLprbqkVWFAzfcn2GUDRGHiH8Pxyi4DxCQi580shcec).
> The error raised by PIL is a `struct.error`, which should be expected but
> is not caught by the chunk feeder loop.
>
> The feeder knows this
>
> {{{
> except zlib.error as e:
> # ignore zlib complaining on truncated stream, just feed
> more
> # data to parser (ticket #19457).
> if e.args[0].startswith("Error -5"):
> pass
> else:
> raise
> }}}
>
> but does not know this
>
> {{{
> from struct import error
> ...
>
> except struct.error:
> pass
> }}}

New description:

Hi,
second time I find a bug in the same function. Here, the function failed
(exception raised and not caught) on a valid PNG file (this image:
https://mega.co.nz/#!W0tXzBAK!iLprbqkVWFAzfcn2GUDRGHiH8Pxyi4DxCQi580shcec).
The error raised by PIL is a `struct.error`, which should be expected but
is not caught by the chunk feeder loop.

The feeder knows this

{{{
except zlib.error as e:
# ignore zlib complaining on truncated stream, just feed
more
# data to parser (ticket #19457).
if e.args[0].startswith("Error -5"):
pass
else:
raise
}}}

but does not know this

{{{
from struct import error
...

except struct.error:
pass
}}}

when you catch the proper exception, the file header fed to the parser
becomes correct starting at offset 9214.
The good news is, it does not need tests.

--

--
Ticket URL: <https://code.djangoproject.com/ticket/24544#comment:1>

Django

unread,
Mar 27, 2015, 5:54:53 AM3/27/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
-------------------------------------+-------------------------------------

Reporter: artscoop | Owner: nobody
Type: Uncategorized | Status: new
Component: File | Version: 1.7
uploads/storage |
Severity: Normal | Resolution:
Keywords: PIL | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------

Comment (by artscoop):

Pull request made here: https://github.com/django/django/pull/4398

--
Ticket URL: <https://code.djangoproject.com/ticket/24544#comment:2>

Django

unread,
Mar 27, 2015, 7:01:23 AM3/27/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
-------------------------------------+-------------------------------------

Reporter: artscoop | Owner: nobody
Type: Uncategorized | Status: new
Component: File | Version: 1.7
uploads/storage |
Severity: Normal | Resolution:
Keywords: PIL | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 1 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by phalt):

* needs_tests: 0 => 1


--
Ticket URL: <https://code.djangoproject.com/ticket/24544#comment:3>

Django

unread,
Mar 27, 2015, 8:00:02 AM3/27/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
--------------------------------------+------------------------------------
Reporter: artscoop | Owner: nobody
Type: Cleanup/optimization | Status: new

Component: File uploads/storage | Version: 1.7
Severity: Normal | Resolution:
Keywords: PIL | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 1 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
--------------------------------------+------------------------------------
Changes (by timgraham):

* has_patch: 0 => 1
* type: Uncategorized => Cleanup/optimization
* stage: Unreviewed => Accepted


--
Ticket URL: <https://code.djangoproject.com/ticket/24544#comment:4>

Django

unread,
Mar 28, 2015, 9:41:54 AM3/28/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
--------------------------------------+------------------------------------
Reporter: artscoop | Owner: nobody
Type: Cleanup/optimization | Status: new

Component: File uploads/storage | Version: 1.7
Severity: Normal | Resolution:
Keywords: PIL | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1

Easy pickings: 0 | UI/UX: 0
--------------------------------------+------------------------------------
Changes (by timgraham):

* needs_better_patch: 0 => 1
* needs_tests: 1 => 0


--
Ticket URL: <https://code.djangoproject.com/ticket/24544#comment:5>

Django

unread,
Apr 7, 2015, 7:52:55 PM4/7/15
to django-...@googlegroups.com
#24544: core.files.images.get_image_dimensions broken on some valid PNG images
--------------------------------------+------------------------------------
Reporter: artscoop | Owner: nobody
Type: Cleanup/optimization | Status: closed

Component: File uploads/storage | Version: 1.7
Severity: Normal | Resolution: fixed

Keywords: PIL | Triage Stage: Accepted
Has patch: 1 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 1
Easy pickings: 0 | UI/UX: 0
--------------------------------------+------------------------------------
Changes (by Tim Graham <timograham@…>):

* status: new => closed
* resolution: => fixed


Comment:

In [changeset:"2fc19b92387d4248c715edfbf38658238978abb6" 2fc19b92]:
{{{
#!CommitTicketReference repository=""
revision="2fc19b92387d4248c715edfbf38658238978abb6"
Fixed #24544 -- Fixed get_image_dimensions() on image buffers that Pillow
fails to parse.

Thanks Steve Kossouho for the report and original patch.
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/24544#comment:6>

Reply all
Reply to author
Forward
0 new messages