Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Apply a timeout to reading the body when fetching a file. (#11784)
Browse files Browse the repository at this point in the history
This prevents the URL preview code from reading
a stream forever.
  • Loading branch information
clokep authored Jan 24, 2022
1 parent ec2271a commit 02d99f0
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
1 change: 1 addition & 0 deletions changelog.d/11784.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a long-standing bug that media streams could cause long-lived connections when generating URL previews.
15 changes: 12 additions & 3 deletions synapse/http/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -731,15 +731,24 @@ async def get_file(
# straight back in again

try:
length = await make_deferred_yieldable(
read_body_with_max_size(response, output_stream, max_size)
)
d = read_body_with_max_size(response, output_stream, max_size)

# Ensure that the body is not read forever.
d = timeout_deferred(d, 30, self.hs.get_reactor())

length = await make_deferred_yieldable(d)
except BodyExceededMaxSize:
raise SynapseError(
HTTPStatus.BAD_GATEWAY,
"Requested file is too large > %r bytes" % (max_size,),
Codes.TOO_LARGE,
)
except defer.TimeoutError:
raise SynapseError(
HTTPStatus.BAD_GATEWAY,
"Requested file took too long to download",
Codes.TOO_LARGE,
)
except Exception as e:
raise SynapseError(
HTTPStatus.BAD_GATEWAY, ("Failed to download remote body: %s" % e)
Expand Down

0 comments on commit 02d99f0

Please sign in to comment.