summaryrefslogtreecommitdiff
path: root/libavformat/tls_securetransport.c
diff options
context:
space:
mode:
authorAman Gupta <aman at tmm1.net>2017-11-13 15:02:44 -0600
committerRodger Combs <rodger.combs@gmail.com>2017-11-13 15:04:55 -0600
commit9c8922acadb5187c274250d6cde653b7bad2559e (patch)
tree362b20ba615a41309133a1ac60222a6f366822fe /libavformat/tls_securetransport.c
parenta36a3d7fecdfc50691f01eef984cad6cedb6fb3a (diff)
downloadffmpeg-9c8922acadb5187c274250d6cde653b7bad2559e.tar.gz
This fixes a deadlock while reading a chunked https response, if
multiple_requests=1 is also set. Without an EOF to signal the end of the last chunk, tls_read gets stuck forever trying to read more data than is available. This occurs with the http protocol reproducibly, because http.c always reads 4kb at a time, and the last chunk of an http response is often much smaller. After this commit, tls_read always returns any buffered plaintext first before attempting to read more encrypted data off the underlying tcp socket. Signed-off-by: Rodger Combs <rodger.combs@gmail.com>
Diffstat (limited to 'libavformat/tls_securetransport.c')
-rw-r--r--libavformat/tls_securetransport.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libavformat/tls_securetransport.c b/libavformat/tls_securetransport.c
index dc32eb1fa8..37380541b1 100644
--- a/libavformat/tls_securetransport.c
+++ b/libavformat/tls_securetransport.c
@@ -364,8 +364,12 @@ static int map_ssl_error(OSStatus status, size_t processed)
static int tls_read(URLContext *h, uint8_t *buf, int size)
{
TLSContext *c = h->priv_data;
- size_t processed = 0;
- int ret = SSLRead(c->ssl_context, buf, size, &processed);
+ size_t available = 0, processed = 0;
+ int ret;
+ SSLGetBufferedReadSize(c->ssl_context, &available);
+ if (available)
+ size = FFMIN(available, size);
+ ret = SSLRead(c->ssl_context, buf, size, &processed);
ret = map_ssl_error(ret, processed);
if (ret > 0)
return ret;