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>
This commit is contained in:
parent
a36a3d7fec
commit
9c8922acad
@ -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…
x
Reference in New Issue
Block a user