Fix /upload 500'ing when presented a very large image (#10029)
* Fix /upload 500'ing when presented a very large image Catch DecompressionBombError and re-raise as ThumbnailErrors * Set PIL's MAX_IMAGE_PIXELS to match homeserver.yaml to get it to bomb out quicker, to load less into memory in the case of super large images * Add changelog entry for 10029pull/10043/head
parent
21bd230831
commit
e8ac9ac8ca
|
@ -0,0 +1 @@
|
|||
Fixed a bug with very high resolution image uploads throwing internal server errors.
|
|
@ -76,6 +76,8 @@ class MediaRepository:
|
|||
self.max_upload_size = hs.config.max_upload_size
|
||||
self.max_image_pixels = hs.config.max_image_pixels
|
||||
|
||||
Thumbnailer.set_limits(self.max_image_pixels)
|
||||
|
||||
self.primary_base_path = hs.config.media_store_path # type: str
|
||||
self.filepaths = MediaFilePaths(self.primary_base_path) # type: MediaFilePaths
|
||||
|
||||
|
|
|
@ -40,6 +40,10 @@ class Thumbnailer:
|
|||
|
||||
FORMATS = {"image/jpeg": "JPEG", "image/png": "PNG"}
|
||||
|
||||
@staticmethod
|
||||
def set_limits(max_image_pixels: int):
|
||||
Image.MAX_IMAGE_PIXELS = max_image_pixels
|
||||
|
||||
def __init__(self, input_path: str):
|
||||
try:
|
||||
self.image = Image.open(input_path)
|
||||
|
@ -47,6 +51,11 @@ class Thumbnailer:
|
|||
# If an error occurs opening the image, a thumbnail won't be able to
|
||||
# be generated.
|
||||
raise ThumbnailError from e
|
||||
except Image.DecompressionBombError as e:
|
||||
# If an image decompression bomb error occurs opening the image,
|
||||
# then the image exceeds the pixel limit and a thumbnail won't
|
||||
# be able to be generated.
|
||||
raise ThumbnailError from e
|
||||
|
||||
self.width, self.height = self.image.size
|
||||
self.transpose_method = None
|
||||
|
|
Loading…
Reference in New Issue