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>
pull/272/head
Aman Gupta 7 years ago committed by Rodger Combs
parent a36a3d7fec
commit 9c8922acad
  1. 8
      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) static int tls_read(URLContext *h, uint8_t *buf, int size)
{ {
TLSContext *c = h->priv_data; TLSContext *c = h->priv_data;
size_t processed = 0; size_t available = 0, processed = 0;
int ret = SSLRead(c->ssl_context, buf, size, &processed); 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); ret = map_ssl_error(ret, processed);
if (ret > 0) if (ret > 0)
return ret; return ret;

Loading…
Cancel
Save