Skip to content

Commit

Permalink
Resolve __fp when closing and deleting
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere committed Nov 17, 2018
1 parent 50d49d6 commit 47775f3
Show file tree
Hide file tree
Showing 16 changed files with 110 additions and 1 deletion.
6 changes: 6 additions & 0 deletions Tests/test_file_dcx.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ def test_sanity(self):
orig = hopper()
self.assert_image_equal(im, orig)

def test_unclosed_file(self):
def open():
im = Image.open(TEST_FILE)
im.load()
self.assert_warning(None, open)

def test_invalid_file(self):
with open("Tests/images/flower.jpg", "rb") as fp:
self.assertRaises(SyntaxError,
Expand Down
6 changes: 6 additions & 0 deletions Tests/test_file_fli.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ def test_sanity(self):
self.assertEqual(im.info["duration"], 71)
self.assertTrue(im.is_animated)

def test_unclosed_file(self):
def open():
im = Image.open(static_test_file)
im.load()
self.assert_warning(None, open)

def test_tell(self):
# Arrange
im = Image.open(static_test_file)
Expand Down
6 changes: 6 additions & 0 deletions Tests/test_file_gif.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ def test_sanity(self):
self.assertEqual(im.format, "GIF")
self.assertEqual(im.info["version"], b"GIF89a")

def test_unclosed_file(self):
def open():
im = Image.open(TEST_GIF)
im.load()
self.assert_warning(None, open)

def test_invalid_file(self):
invalid_file = "Tests/images/flower.jpg"

Expand Down
6 changes: 6 additions & 0 deletions Tests/test_file_im.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@ def test_sanity(self):
self.assertEqual(im.size, (128, 128))
self.assertEqual(im.format, "IM")

def test_unclosed_file(self):
def open():
im = Image.open(TEST_IM)
im.load()
self.assert_warning(None, open)

def test_tell(self):
# Arrange
im = Image.open(TEST_IM)
Expand Down
6 changes: 6 additions & 0 deletions Tests/test_file_mpo.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ def test_sanity(self):
self.assertEqual(im.size, (640, 480))
self.assertEqual(im.format, "MPO")

def test_unclosed_file(self):
def open():
im = Image.open(test_files[0])
im.load()
self.assert_warning(None, open)

def test_app(self):
for test_file in test_files:
# Test APP/COM reader (@PIL135)
Expand Down
6 changes: 6 additions & 0 deletions Tests/test_file_spider.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ def test_sanity(self):
self.assertEqual(im.size, (128, 128))
self.assertEqual(im.format, "SPIDER")

def test_unclosed_file(self):
def open():
im = Image.open(TEST_FILE)
im.load()
self.assert_warning(None, open)

def test_save(self):
# Arrange
temp = self.tempfile('temp.spider')
Expand Down
6 changes: 6 additions & 0 deletions Tests/test_file_tiff.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ def test_sanity(self):
hopper("I").save(filename)
Image.open(filename)

def test_unclosed_file(self):
def open():
im = Image.open("Tests/images/multipage.tiff")
im.load()
self.assert_warning(None, open)

def test_mac_tiff(self):
# Read RGBa images from macOS [@PIL136]

Expand Down
8 changes: 8 additions & 0 deletions src/PIL/DcxImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ def seek(self, frame):
def tell(self):
return self.frame

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None


Image.register_open(DcxImageFile.format, DcxImageFile, _accept)

Expand Down
8 changes: 8 additions & 0 deletions src/PIL/FliImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,14 @@ def _seek(self, frame):
def tell(self):
return self.__frame

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None


#
# registry
Expand Down
8 changes: 8 additions & 0 deletions src/PIL/GifImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,14 @@ def load_end(self):
self.im = self._prev_im
self._prev_im = self.im.copy()

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None

# --------------------------------------------------------------------
# Write GIF files

Expand Down
8 changes: 8 additions & 0 deletions src/PIL/ImImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,14 @@ def seek(self, frame):
def tell(self):
return self.frame

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None

#
# --------------------------------------------------------------------
# Save IM files
Expand Down
4 changes: 4 additions & 0 deletions src/PIL/Image.py
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,8 @@ def close(self):
try:
self.fp.close()
self.fp = None
if hasattr(self, "_close__fp"):
self._close__fp()
except Exception as msg:
logger.debug("Error closing: %s", msg)

Expand All @@ -613,6 +615,8 @@ def __del__(self):
and self.fp and self._exclusive_fp):
self.fp.close()
self.fp = None
if hasattr(self, "_close__fp"):
self._close__fp()

def _copy(self):
self.load()
Expand Down
9 changes: 8 additions & 1 deletion src/PIL/MicImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,16 @@ def seek(self, frame):
self.frame = frame

def tell(self):

return self.frame

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None


#
# --------------------------------------------------------------------
Expand Down
8 changes: 8 additions & 0 deletions src/PIL/MpoImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,14 @@ def seek(self, frame):
def tell(self):
return self.__frame

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None


# ---------------------------------------------------------------------
# Registry stuff
Expand Down
8 changes: 8 additions & 0 deletions src/PIL/SpiderImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,14 @@ def tkPhotoImage(self):
from PIL import ImageTk
return ImageTk.PhotoImage(self.convert2byte(), palette=256)

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None


# --------------------------------------------------------------------
# Image series
Expand Down
8 changes: 8 additions & 0 deletions src/PIL/TiffImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -1347,6 +1347,14 @@ def _setup(self):
palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]]
self.palette = ImagePalette.raw("RGB;L", b"".join(palette))

def _close__fp(self):
try:
self.__fp.close()
except AttributeError:
pass
finally:
self.__fp = None


#
# --------------------------------------------------------------------
Expand Down

0 comments on commit 47775f3

Please sign in to comment.