element-hq / element-hq/synapse
Thumbnailer fails with requested `width=0` or `height=0`
- Dominant language
- Python
- Stars
- 4.6k
- Forks
- 600
- Avg merge
- 5d 22h
- Merged PRs (30d)
- 51
Description
This issue has been migrated from [#14579](https://github.com/matrix-org/synapse/issues/14579).
---
### Description
If you request a thumbnail with `width=0&height=0` (for both `scale` and `crop`)
- container image returns `HTTP 500`
- Ubuntu package returns the image
I cannot explain why the platforms behave differently.
In any case, validation of the rest API is missing (#13147).
### Steps to reproduce
Ubuntu package deployment
- request an thumbnail image (eg. profile image)
- `HTTP GET` [https://example.com/_matrix/media/r0/thumbnail/example.com/?width=0&height=0&method=scale]()
- you get the image
container deployment
- request an thumbnail image (eg. profile image)
- `HTTP GET` [https://example.com/_matrix/media/r0/thumbnail/example.com/?width=0&height=0&method=scale]()
- you get an error `HTTP 500`: `{"errcode":"M_UNKNOWN","error":"Internal server error"}`
```
2022-11-29 09:40:59,762 - synapse.http.server - 124 - ERROR - GET-13- Failed handle request via 'ThumbnailResource':
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/synapse/http/server.py", line 307, in _async_render_wrapper
callback_return = await self._async_render(request)
File "/usr/local/lib/python3.9/site-packages/synapse/http/server.py", line 337, in _async_render
callback_return = await raw_callback_return
File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnail_resource.py", line 76, in _async_render_GET
await self._select_or_generate_local_thumbnail(
File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnail_resource.py", line 178, in _select_or_generate_local_thumbnail
file_path = await self.media_repo.generate_local_exact_thumbnail(
File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/media_repository.py", line 592, in generate_local_exact_thumbnail
t_byte_source = await defer_to_thread(-packages/synapse/rest/media/v1/thumbnail_resource.py", line 178, in _select_or_generate_local_thumbnail
file_path = await self.media_repo.generate_local_exact_thumbnail(
File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/media_repository.py", line 592, in generate_local_exact_thumbnail
t_byte_source = await defer_to_thread(
File "/usr/local/lib/python3.9/site-packages/twisted/python/threadpool.py", line 244, in inContext
result = inContext.theWork() # type: ignore[attr-de
File "/usr/local/lib/python3.9/site-packages/twisted/python/threadpool.py", line 244, in inContext
result = inContext.theWork() # type: ignore[attr-defined]
File "/usr/local/lib/python3.9/site-packages/twisted/python/threadpool.py", line 260, in
inContext.theWork = lambda: context.call( # type: ignore[attr-defined]
File "/usr/local/lib/python3.9/site-packages/twisted/python/context.py", line 117, in callWithContext
return self.currentContext().callWithContext(ctx, func, *args, **kw)
File "/usr/local/lib/python3.9/site-packages/twisted/python/context.py", line 82, in callWithContext
return func(*args, **kw)
File "/usr/local/lib/python3.9/site-packages/synapse/logging/context.py", line 970, in g
return f(*args, **kwargs)
File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/media_repository.py", line 562, in _generate_thumbnail
return thumbnailer.scale(t_width, t_height, t_type)
File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnailer.py", line 143, in scale
with self._resize(width, height) as scaled:
File "/usr/local/lib/python3.9/site-packages/synapse/rest/media/v1/thumbnailer.py", line 135, in _resize
return self.image.resize((width, height), Image.ANTIALIAS)
File "/usr/local/lib/python3.9/site-packages/PIL/Image.py", line 2115, in resize
return self._new(self.im.resize(size, resample, box))
ValueError: height and width must be > 0
```
I am did the same image for both plattforms / servers.
### Homeserver
another homeserver
### Synapse Version
various
### Installation Method
Other (please mention below)
### Database
single PostgreSQL server
### Workers
Multiple workers
### Platform
- Container / K8s platform:
- Synapse v1.64.0 and 1.72.0 (`matrixdotorg/synapse:latest`)
- Debian/Ubuntu platform
- Synapse v1.71.0 ([matrix.org package](https://matrix-org.github.io/synapse/latest/setup/installation.html#matrixorg-packages))
### Configuration
_No response_
### Relevant log output
```shell
see above
```
### Anything else that would be useful to know?
container version:
```
cat /usr/local/lib/python3.9/site-packages/PIL/_version.py
# Master version for Pillow
__version__ = "9.3.0
```
package version:
```
cat /opt/venvs/matrix-synapse/lib/python3.8/site-packages/PIL/_version.py
# Master version for Pillow
__version__ = "9.2.0"
```
Contributor guide
Assessment
This issue has not been assessed yet.