From 7dbf0209e351a99076636e6b7ea3d30a9b671e60 Mon Sep 17 00:00:00 2001 From: kraiz Date: Mon, 12 Oct 2015 20:24:33 +0200 Subject: [PATCH] prevent div by zero for exif rationals with zero denominator --- PIL/TiffImagePlugin.py | 4 +++- Tests/images/exif_zerodivisionerror.jpg | Bin 0 -> 6185 bytes Tests/test_file_jpeg.py | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Tests/images/exif_zerodivisionerror.jpg diff --git a/PIL/TiffImagePlugin.py b/PIL/TiffImagePlugin.py index a84d01755..7b23df392 100644 --- a/PIL/TiffImagePlugin.py +++ b/PIL/TiffImagePlugin.py @@ -208,6 +208,8 @@ OPEN_INFO = { PREFIXES = [b"MM\000\052", b"II\052\000", b"II\xBC\000"] +FLOAT_MIN = sys.float_info.min * sys.float_info.epsilon + def _accept(prefix): return prefix[:4] in PREFIXES @@ -477,7 +479,7 @@ class ImageFileDirectory_v2(collections.MutableMapping): @_register_loader(5, 8) def load_rational(self, data, legacy_api=True): vals = self._unpack("{0}L".format(len(data) // 4), data) - combine = lambda a, b: (a, b) if legacy_api else a / b + combine = lambda a, b: (a, b) if legacy_api else a / (b or FLOAT_MIN) return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) diff --git a/Tests/images/exif_zerodivisionerror.jpg b/Tests/images/exif_zerodivisionerror.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2715215a22903531d473f9caf3649f4fbf08397e GIT binary patch literal 6185 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 J=R^Og{{T>