mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2024-12-26 12:59:22 -05:00
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 10029
This commit is contained in:
parent
21bd230831
commit
e8ac9ac8ca
1
changelog.d/10029.bugfix
Normal file
1
changelog.d/10029.bugfix
Normal file
@ -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_upload_size = hs.config.max_upload_size
|
||||||
self.max_image_pixels = hs.config.max_image_pixels
|
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.primary_base_path = hs.config.media_store_path # type: str
|
||||||
self.filepaths = MediaFilePaths(self.primary_base_path) # type: MediaFilePaths
|
self.filepaths = MediaFilePaths(self.primary_base_path) # type: MediaFilePaths
|
||||||
|
|
||||||
|
@ -40,6 +40,10 @@ class Thumbnailer:
|
|||||||
|
|
||||||
FORMATS = {"image/jpeg": "JPEG", "image/png": "PNG"}
|
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):
|
def __init__(self, input_path: str):
|
||||||
try:
|
try:
|
||||||
self.image = Image.open(input_path)
|
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
|
# If an error occurs opening the image, a thumbnail won't be able to
|
||||||
# be generated.
|
# be generated.
|
||||||
raise ThumbnailError from e
|
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.width, self.height = self.image.size
|
||||||
self.transpose_method = None
|
self.transpose_method = None
|
||||||
|
Loading…
Reference in New Issue
Block a user