Apply a timeout to reading the body when fetching a file. (#11784)

This prevents the URL preview code from reading
a stream forever.
This commit is contained in:
Patrick Cloke 2022-01-24 09:38:37 -05:00 committed by GitHub
parent ec2271ac50
commit 02d99f044e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 3 deletions

1
changelog.d/11784.bugfix Normal file
View File

@ -0,0 +1 @@
Fix a long-standing bug that media streams could cause long-lived connections when generating URL previews.

View File

@ -731,15 +731,24 @@ class SimpleHttpClient:
# straight back in again # straight back in again
try: try:
length = await make_deferred_yieldable( d = read_body_with_max_size(response, output_stream, max_size)
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: except BodyExceededMaxSize:
raise SynapseError( raise SynapseError(
HTTPStatus.BAD_GATEWAY, HTTPStatus.BAD_GATEWAY,
"Requested file is too large > %r bytes" % (max_size,), "Requested file is too large > %r bytes" % (max_size,),
Codes.TOO_LARGE, 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: except Exception as e:
raise SynapseError( raise SynapseError(
HTTPStatus.BAD_GATEWAY, ("Failed to download remote body: %s" % e) HTTPStatus.BAD_GATEWAY, ("Failed to download remote body: %s" % e)