From e1e35cc81945423526e4cf9bf4c735013be22b29 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Mon, 1 Apr 2019 00:02:22 +1100 Subject: [PATCH] Close internal fp when closing and deleting --- Tests/test_file_psd.py | 6 ++++++ src/PIL/PsdImagePlugin.py | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Tests/test_file_psd.py b/Tests/test_file_psd.py index 3d434d5a7fe..c62d7ca1062 100644 --- a/Tests/test_file_psd.py +++ b/Tests/test_file_psd.py @@ -17,6 +17,12 @@ def test_sanity(self): im2 = hopper() self.assert_image_similar(im, im2, 4.8) + def test_unclosed_file(self): + def open(): + im = Image.open(test_file) + im.load() + self.assert_warning(None, open) + def test_invalid_file(self): invalid_file = "Tests/images/flower.jpg" diff --git a/src/PIL/PsdImagePlugin.py b/src/PIL/PsdImagePlugin.py index 17e6bc4e98f..576ea90243c 100644 --- a/src/PIL/PsdImagePlugin.py +++ b/src/PIL/PsdImagePlugin.py @@ -129,7 +129,7 @@ def _open(self): self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) # keep the file open - self._fp = self.fp + self.__fp = self.fp self.frame = 1 self._min_frame = 1 @@ -151,7 +151,7 @@ def seek(self, layer): self.mode = mode self.tile = tile self.frame = layer - self.fp = self._fp + self.fp = self.__fp return name, bbox except IndexError: raise EOFError("no such layer") @@ -168,6 +168,15 @@ def load_prepare(self): if self.mode == "P": Image.Image.load(self) + def _close__fp(self): + try: + if self.__fp != self.fp: + self.__fp.close() + except AttributeError: + pass + finally: + self.__fp = None + def _layerinfo(file): # read layerinfo block